Seite 1 von 1

daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 12:00
von Sync32
Hallo, ich experimentiere gerade mit socket und hab mir ein kleinen tcp-server u. -client gebastelt der einfach nur nachrichten empfängt und der client welche verschickt

client
....
nachricht = raw_input("Nachricht: ")
s.send(nachricht)


server
.....
nachricht = sock.recv(1024)


Wie kann ich dem Server auch weitere Information mitschicken wie z.B. Username
Muss ich das mit in die Nachricht mitsenden und dann beim server selber rausparsen?
Hab schon versucht einfach ne Liste zu schicken info_list = (username, nachricht) und es dann einfach so auch auszulesen aber das geht nicht man kann anscheinend nur nen string schicken

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 12:39
von EyDu
Hallo.

Du musst Benutzernamen etc. in die versendeten Daten so mit einbauen, dass du die Nachricht beim Empfänger wieder in die Einzelteile zerlegen kannst. Das kannst du entweder kompliziert (und fehleranfällig) per Hand machen oder du verwendest einen vorhandenen Serialisierer. An deiner Stelle würde ich ein Dictionary mit den Einträgen Name und Nachricht erstellen, dies durch das json-Modul jagen und den erzeugen String verschicken. Beim Emfänger dann entsprechend umgekehrt.

Sebastian

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 12:48
von Sync32
Ok aber fakt ist, dass ich letzendlich nur einen String rübersenden kann...richtig?

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 12:51
von lunar
@Sync32: Genau genommen kannst Du über eine Socket-Verbindung nur einen Bytestrom versenden, also auch Binärdaten. Das bedeutet vor allem auch, dass Du Dich beim Versenden von Zeichenketten selbst um die korrekte Kodierung kümmern musst.

Letztlich ist das aber doch egal, da Du in eine Bytefolge ja beliebige Daten verpacken kannst, solange nur beide Endpunkte wissen, wie sie die Daten aus der Bytefolge extrahieren können.

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 13:00
von ms4py
Sync32 hat geschrieben:Ok aber fakt ist, dass ich letzendlich nur einen String rübersenden kann...richtig?
Du kannst auch mehrere Nachrichten senden. Um die einzelnen identifizieren zu können musst du halt ein Trennzeichen verwenden oder eine Art von Protokoll entwerfen.

Eine Lösung wäre es, die Länge der Nachricht als eine Art Header zu verschicken. Dazu musst du diese in eine feste Länge verpacken, dazu nimmt man struct. Ein Beispiel daür gibt es in der stdlib, der SocketHandler der logging-Bibliothek:

Senden: http://hg.python.org/cpython/file/b4525 ... rs.py#l504
Empfangen: http://docs.python.org/howto/logging-co ... -a-network

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 14:27
von Sync32
Hab die Informationen nun mit pickle "aufgeteilt".
Klappt auch gut.
Danke

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 14:36
von lunar
Die Warnung am Anfang der Pickle-Dokumentation hast Du gelesen und verstanden?

Wenn Du pickle nutzen möchtest, um Daten über eine unsichere Leitung zu versenden, dann ist es dringend ratsam, diese Daten mittels hmac gegen Manipulationen zu schützen oder zu verschlüsseln.

Als sichere Alternative bietet sich das bereits erwähnte JSON an.

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 15:05
von BlackJack
@Sync32: Wie stellst Du sicher dass der Empfänger die ganze Nachricht hat, bevor Du "entpickelst"?

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 19:18
von ms4py
lunar hat geschrieben:Wenn Du pickle nutzen möchtest, um Daten über eine unsichere Leitung zu versenden, dann ist es dringend ratsam, diese Daten mittels hmac gegen Manipulationen zu schützen oder zu verschlüsseln.
Oder eine sichere unpickling-Methode verwenden: s. http://docs.python.org/py3k/library/pic ... ng-globals

Re: daten aufsplitten

Verfasst: Donnerstag 28. April 2011, 21:10
von Leonidas
ms4py hat geschrieben:Du kannst auch mehrere Nachrichten senden. Um die einzelnen identifizieren zu können musst du halt ein Trennzeichen verwenden oder eine Art von Protokoll entwerfen.
An dieser Stelle kommen dann Messageques wie 0MQ ins Spiel. Gerade im Vergleich zu AMQP interessant, eben weil es fast auf der Ebene von sockets ist aber den Bytestrom in Nachrichten kapselt.