Listen über sockets übertragen?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
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.
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

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.
BlackJack

`pickle` ist etwas was man nur für vertrauenswürdige Quellen machen darf, oder man muss es gesondert kryptografisch absichern.
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

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?
BlackJack

@miracle173: Nein. Das entpicklen kann Python-Code einschleusen und ausführen, JSON sind bloss Daten.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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'))
Antworten