daten aufsplitten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ok aber fakt ist, dass ich letzendlich nur einen String rübersenden kann...richtig?
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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Hab die Informationen nun mit pickle "aufgeteilt".
Klappt auch gut.
Danke
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.
BlackJack

@Sync32: Wie stellst Du sicher dass der Empfänger die ganze Nachricht hat, bevor Du "entpickelst"?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten