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.
Best practice tcp connection
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.
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.
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.
Als Framework bietet sich dann z.B. das externe flask-Modul an. Da könnte man zu jsonify() greifen.
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?
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?
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.
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.
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.