Seite 1 von 1

socket recv

Verfasst: Dienstag 24. November 2009, 22:12
von jbs
Ich habe das Problem, dass ich zwei Nachrichten ueber sockets versende und diese dann als eine ankommen (und das auch nicht immer):

Code: Alles auswählen

#client
socket.send('a')
socket.send('b')

#server
print socket.recv(1024)
#manchmal
'ab'
#manchmal
'a'
'b'

Ich hätte es gerne, dass ich für jedes send auch am ende ein recv zum verarbeiten zuständig ist.

Wie kann ich das Gewährleisten?

Verfasst: Dienstag 24. November 2009, 23:41
von Trundle
Gar nicht.

Verfasst: Dienstag 24. November 2009, 23:46
von jbs
Gut. Danke.

Verfasst: Mittwoch 25. November 2009, 00:10
von ms4py
Dazu musst du schon im OSI-Layer eine Stufe höher wandern.

Je nach Anwendung HTTP, XML-RPC, Pyro (PythonRemoteObjects), etc...
Wenn du mal deine Anforderungen genauer definierst, können wir hier konkreter werden.

Oder du definierst dein eigenes Protokoll, damit du die einzelnen Nachrichten unterscheiden kannst.
Reicht ja im Prinzip ein simpler XML-Tag:

Code: Alles auswählen

<message>a</message><message>b</message>

Verfasst: Mittwoch 25. November 2009, 00:14
von jbs
Ich schicke JSON-Strings übers Netzwerk.

Ich dachte ich könnte einfach pro recv einmal die Daten decoden und dann mit ihnen weiter verfahren.

Allerdings schimpft json bei `{...}{...}`.

Ich hatte gehofft es funktioniert so, ohne da noch etwas drumherumbauen zu müssen.

Verfasst: Mittwoch 25. November 2009, 00:41
von ms4py
Verwendest du json nur um die Daten zu verpacken und dann zu versenden?

Wenn ja, wäre XML-RPC oder Pyro eine gute Alternative, diese Technologien abstrahieren das Encoden und Decoden in eine zur Übertragung nötigen Darstellungsform.

Edit: Im Modul ``logging`` hab ich gerade noch einen interessanten Ansatz entdeckt, um das Problem zu lösen, die Länge der Nachricht wird als ``struct`` verpackt gesendet und dann die Nachricht. Dann wird nur so viel vom Socket gelesen wie die übermittelte Länge. Hier der Link:
http://docs.python.org/dev/library/logg ... -a-network
Gemeint ist natürlich die Methode "LogRecordStreamHandler.handle"
(Falls du damit nichts anfangen kannst, kann ich es auch genauer erläutern.)