Socket: Problem mit Send

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Barazanthul
User
Beiträge: 3
Registriert: Sonntag 1. März 2009, 13:14

Sonntag 1. März 2009, 13:23

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()
Zuletzt geändert von Barazanthul am Samstag 7. März 2009, 10:04, insgesamt 2-mal geändert.
BlackJack

Sonntag 1. März 2009, 13:33

@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.
Barazanthul
User
Beiträge: 3
Registriert: Sonntag 1. März 2009, 13:14

Sonntag 1. März 2009, 14:00

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.
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sonntag 1. März 2009, 14:12

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.
Barazanthul
User
Beiträge: 3
Registriert: Sonntag 1. März 2009, 13:14

Sonntag 1. März 2009, 14:14

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')
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 1. März 2009, 22:42

Das ``str`` kannst du dir sparen. ``"Hallo Welt".encode('utf-8')`` geht direkt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten