Seite 1 von 1
Re: Listen über sockets übertragen?
Verfasst: Freitag 5. Februar 2016, 14:10
von Sirius3
@LKX: es gibt verschiedene Darstellungen und verschiedene Protokolle für die Übertragung. Welches das geeignetste ist, kommt auf die Anwendung an. Wenn es etwas RPC-artiges ist, gibt es schon fertige Module für XML-RPC/SOAP, JSON-RPC. Bei reinen Binärformaten (Pickle, Protobuffer, ...) mußt Du noch ein geeignetes Übertragungsprotokoll entwickeln.
Re: Listen über sockets übertragen?
Verfasst: Freitag 5. Februar 2016, 15:37
von snafu
LKX hat geschrieben:Ich würde gerne ein list Objekt über das Socket Modul übertragen.
In welchem Zusammenhang wird das Objekt am anderen Ende der Verbindung denn benötigt?
Re: Listen über sockets übertragen?
Verfasst: Freitag 5. Februar 2016, 20:09
von BlackJack
@LKX: Ich würde da entweder eine RESTful API mit JSON als Serialisierungsformat basteln oder XML-RPC verwenden. Für ersteres kann man eines der Webanwendungs-Microrahmenwerke benutzen (Bottle oder Flask), für letzteres gibt es ein Modul in der Standardbibliothek.
Re: Listen über sockets übertragen?
Verfasst: Samstag 6. Februar 2016, 00:43
von miracle173
Ich habe da keine Erfahrung, aber
In computer science, marshalling or marshaling is the process of transforming the memory representation of an object to a data format suitable for storage or transmission(...)
https://en.wikipedia.org/wiki/Marshalli ... r_science). Tatsächlich gibt es ein Modul
marshal https://docs.python.org/3/library/marshal.html in Python. Und dort steht dann
For general persistence and transfer of Python objects through RPC calls, see the modules pickle and shelve.
Im
pickle Modul
https://docs.python.org/3/library/pickle.htm wird als weitere Variante auf das Modul
json verwiesen.
Re: Listen über sockets übertragen?
Verfasst: Samstag 6. Februar 2016, 01:38
von BlackJack
`pickle` ist etwas was man nur für vertrauenswürdige Quellen machen darf, oder man muss es gesondert kryptografisch absichern.
Re: Listen über sockets übertragen?
Verfasst: Samstag 6. Februar 2016, 08:47
von miracle173
BlackJack hat geschrieben:`pickle` ist etwas was man nur für vertrauenswürdige Quellen machen darf, oder man muss es gesondert kryptografisch absichern.
Sollte das nicht für
json genauso gelten?
Re: Listen über sockets übertragen?
Verfasst: Samstag 6. Februar 2016, 11:23
von BlackJack
@miracle173: Nein. Das entpicklen kann Python-Code einschleusen und ausführen, JSON sind bloss Daten.
Re: Listen über sockets übertragen?
Verfasst: Samstag 6. Februar 2016, 13:53
von Sirius3
Bei solchen "Tutorials" frage ich mich immer, was diese unpräzise Ausdrucksweise bringen soll. Bei UDP "keine eingebaute Fehlerkorrektur", was fängt damit jemand an, der keine Ahnung von UDP hat? Nichts, zumal die Aussage falsch ist. Jedes empfangene Byte ist genauso richtig oder falsch wie bei TCP-Übertragung. Gemeint ist, dass bei UDP jedes gesendete Packet keinmal, einmal oder sogar mehrfach beim Empfänger ankommen kann. Der Ausflug zu Big-Endian und Little-Endian ist auch mehr als seltsam, die Anwendung von htons in Python unsinnig.
Dann macht das Tutorial die üblichen Fehler bei Socket-Programmierung: Binden des Servers an ein zufällig ausgewähltes Interface, statt an alle verfügbaren. Bei TCP wird einfach ignoriert, dass es sich um ein Stream-Protokoll handelt und statt dessen wird angenommen, dass Pakete verschickt werden.
Der HTTP-Client im Anhang ist auch mehr als gruselig. Wenn man die Grenze zwischen HTTP-Header und Daten am "<" festmacht. Zum schreiend Davonlaufen.
Dann die üblichen Fehler beim Schreiben von Pythoncode: *-Importe, unnötiges verwenden von del, Code nach einer while-True-Schleife die nie regulär verlassen wird.
Re: Listen über sockets übertragen?
Verfasst: Samstag 6. Februar 2016, 15:49
von snafu
Ja, mit dem bereits mehrfach genannten JSON:
Code: Alles auswählen
import json
# Sender
encoded = json.dumps([1,2,3]).encode('ascii')
# Empfänger
json.loads(encoded.decode('ascii'))