Best practice tcp connection

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
fiNYvo
User
Beiträge: 8
Registriert: Dienstag 25. August 2020, 06:14

Hallo Zusammen,
ich arbeite aktuell an einem Projekt, in dem Server/Clients miteinander kommunizieren müssen.
Verwendet wird aktuell die standard library socket. Die Informationen die ausgetauscht werden, speicher ich über ein Modul in einem dictonary. Dieses Modul haben Server und Clients gleichermaßen.

1. Frage: Ist das mit dem dictonary ein guter Lösungsansatz? Meiner Meinung nach, hat man mit dem dict eine Möglichkeit im nachgang Erweiterungen vorzunehmen ohne das alles neu überarbeitet werden muss.

2. Frage: Mir ist zu Ohren gekommen, dass bei send und recv nicht darauf geachtet werden das alle Bytes gesendet bzw. angekommen sind. Wie geht man das Lösen?

Vielen Dank für Eure Hilfe.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt keine best-practice. Dazu ist das Thema zu komplex.
Was ist denn die Aufgabe der Server/Client- Kommunikation? Ohne das zu lösende Problem zu kennen kann man ja schlecht sagen ob die Lösung passt. Und ohne den Code zu kennen, kann man schlecht sagen, ob die Lösung fehlerfrei programmiert ist.
Statt selbst etwas zu programmieren, benutze etwas bereits etabliertes. Was das sein könnte, kann man aber auch erst sagen, wenn man die Aufgabe kennt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Alternativ zum Dictionary wäre auch ein Austausch per JSON denkbar. Zur Vereinfachung würde ich dann auch eher zu HTTP bzw HTTPS raten. Kommt aber, wie schon erwähnt wurde, darauf an was du genau machen willst.

Als Framework bietet sich dann z.B. das externe flask-Modul an. Da könnte man zu jsonify() greifen.
fiNYvo
User
Beiträge: 8
Registriert: Dienstag 25. August 2020, 06:14

Hallo Sirius3,
das Gesamtkonzept ist, das z.B. Client A einen Auftrag an den Server stellt. Der Server bearbeitet diesen Auftrag und erstellt dahingehend ein virtuelles uniques Produkt und gibt eine Rückmeldung über die Kennung und Bestätigung das dass Produkt erstellt wurde. Ein anderer Client (Client B) kann dem Server die Kennung von einem Produkt zukommen lassen mit der Anfrage, ob das angegebene Produkt vom Server erstellt worden ist.

Client A --> Server notwendige Einträge im Dict: Produkt Informationen, Anzahl Produkte
Server --> Client A notwendige Einträge im Dict: liste der Kennungen, Zustand (erstellt oder nicht erstellt)

Client B --> Server notwendige Einträge im Dict: Kennung zur Prüfung
Server --> Client B notwendige Einträge im Dict: Ergebnis

Also wären die folgenden Keys standardmäßig im dict: Produkt Informationen, Anzahl Produkte, liste der Kennungen, Zustand, Kennung zur Prüfung, Ergebnis

Alle Parteien nutzen dieses Grundgerüst, setzen jedoch nur die geforderten values ein.
Das funktioniert alles sehr gut. Jetzt ist nur die Frage ob das Sinnvoll ist, es so zu machen? Ich denke hier ist es unerheblich was für ein Code ich erzeugt habe.

Zur zweiten Frage: gibt es Module die gewährleisten das alle Bytes zuverlässig übertragen werden?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast also nur eine simple REST-Schnittstelle: Client stellt eine Anfrage und bekommt vom Server eine Antwort. Die Anfragen und Antworten sind simple Datenstrukturen, die per JSON serialisiert werden können.

Daher hat snafu richtig geraten. Was Du programmieren mußt, ist eine HTTP-Schnittstelle, für den Server bietet sich Flask an, für den Client requests.

Selbst ein Netzwerkprotokoll dafür zu schreiben, ist nur umständlich, kompliziert und fehleranfällig.
fiNYvo
User
Beiträge: 8
Registriert: Dienstag 25. August 2020, 06:14

Vielen Dank für eure Hilfe und den Hinweis. Ich werde mal schauen wie sich das in mein Programm integrieren lässt. Der Server könnte zukünftig tatsächlich auch ein Web-Framework anderweitig benötigen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Trenne ab besten die Logik für die internen Prüfungen und Ergebnis-Erzeugung von der Netzwerk-Logik, falls nicht bereits geschehen. Dann ist letzteres leicht austauschbar. Den Code für die Dictionarys musst du ja nicht verwerfen. Das fertige Dict muss bloß am Ende in dem erwähnten Aufruf der flask-API eingesetzt werden. Ein bißchen Drumherum für's Setup ist natürlich auch nötig, aber mit flask relativ schnell gemacht. Deutlich schneller als wenn man mit "nackten" Sockets arbeitet.
Antworten