Seite 1 von 1

Socket: Problem mit Send

Verfasst: Sonntag 1. März 2009, 13:23
von Barazanthul
Heute morgen habe ich einfach mal angefangen in Py zu proggen. Lange Rede kurzer Sinn.

Ich habe mich dann an Sockets gewagt. In Java und Perl habe ich das ja schon hinbekommen, dann kann das ja in Py nicht so schwer sein.

Die Verbindung baut er auf. Aber wenn der Client mit send() Daten senden will erzählt man mir folgendes:

Traceback (most recent call last):
File "C:\PythonProjekt\Test\client.py", line 12, in <module>
s.send('Hello World') # send the data
TypeError: send() argument 1 must be bytes or buffer, not str

Alle Beispiele die ich gefunden habe senden direkt nen String. Nun wäre mein Frage warum der kleine Bara das nicht darf?

Das hier ist der Client

Code: Alles auswählen


s.connect((serverHost, serverPort)) 
s.send('Hello World')               

Das hier der Server:

Code: Alles auswählen

s = socket(AF_INET, SOCK_STREAM)
s.bind((myHost, myPort))
s.listen(1)

  connection, address = s.accept()

  data = connection.recv(1024)

  connection.send("echo -> "+data)
  print(data)

  connection.close()

Verfasst: Sonntag 1. März 2009, 13:33
von BlackJack
@Barazanthul: Du verwendest Python 3.x und die Beispiele sind wahrscheinlich alle für Python <3 gewesen. Ab Python 3.0 ist `str` was früher `unicode` war. Über Sockets kann man nun aber keine Zeichen, sondern nur Bytes versenden, also musst Du die Zeichen vorher kodieren. Schau Dir mal die Methoden auf `str` an. Und arbeite am besten mal das Tutorial in der Python-Dokumentation durch, um die Grunddatentypen kennen zu lernen.

Verfasst: Sonntag 1. März 2009, 14:00
von Barazanthul
Schonmal danke für die Antwort und ja ich benutze Python 3.x.

Hmm soweit so gut. Mich beschleicht das böse Gefühl das Py einen String nicht unbedingt als Object ansieht.

Meine Idee war mit der buffer() Methode einen Buffer zu erzeugen und diesen weiterzugeben.

Tante Edit sagt: str.encode() wäre wenn ich das ganze richtig verstehe auch ne Idee.

Mit den Methoden auf str meinst du die Methoden von str?
Das Tut habe ich mitlerweile auch intus.

Verfasst: Sonntag 1. März 2009, 14:12
von DasIch
Barazanthul hat geschrieben:Hmm soweit so gut. Mich beschleicht das böse Gefühl das Py einen String nicht unbedingt als Object ansieht.
Alles was man an einem Namen binden kann ist ein Objekt.

Das Problem ist einfach dass du socket.send ein str Objekt übergibst aber ein bytes oder buffer Objekt gefordert ist.

Verfasst: Sonntag 1. März 2009, 14:14
von Barazanthul
Problem gelöst.

Den Codeschnipsel unten einfügen und dann den buff senden.
Danke für die Hilfe.

Code: Alles auswählen

unicode_text = str('Hello World')
buff = unicode_text.encode('utf-8')

Verfasst: Sonntag 1. März 2009, 22:42
von Leonidas
Das ``str`` kannst du dir sparen. ``"Hallo Welt".encode('utf-8')`` geht direkt.