Socket Programmierung Multi-Client

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
da1000
User
Beiträge: 4
Registriert: Donnerstag 24. Oktober 2019, 11:29

Hey Leute,

ich bin noch relativ neu in der Programmierung (v.a. auch Netzwerk/Socket etc.) und bräuchte mal kurz eure Hilfe zu einem Server / Client Protokoll.

Mein Ziel: Eine ganz simple Socket - Server - Client Programmierung, mit mehreren Clients zur Auswahl.

Server schickt Befehle (Daten auslesen, GPIO ansteuern etc.) und der ausgewählte Client antwortet - nichts Wildes.

Hierzu hab ich mir auf YouTube die Tutorials von "buildwithpython" angeschaut. https://www.youtube.com/playlist?list=P ... 1giva2payF

Ist, finde ich sehr gut erklärt und hat mir viel gebracht. Der Single-Client läuft bei mir 1A – auch die Programmierung von GPIO-Befehlen etc. habe ich alles super geklappt.

Bei dem MultiClienten hab ich allerdings ein paar Probleme mit dem Server.py Protokoll.

Es funktioniert nämlich nicht so wie in den Videos und ich kann mir leider nicht weiterhelfen.

Und zwar folgendes:

Wenn ich die Server.py starte, bekomme ich folgende Meldung: (soweit alles ok)
Bild

Starte ich nun die Client.py, verbindet sich diese mit dem Server, allerdings wird mir die Meldung einer erfolgreichen Verbindung nicht angezeigt!
Auf meinen Bildschirm passiert nichts.
Erst nachdem ich in dem Server-Fenster "Enter" drücke, kommt die Nachricht, dass eine Verbindung hergestellt wurde (+ Nachricht eines nicht vorhandenen Befehls "Command not recognized).

Allerdings soll die Nachricht einer Verbindung automatisch aufpoppen. Im Single Client / Server funktioniert das einwandfrei. Nur hier leider nicht.
Bild

Wenn ich einen 2. Clienten verbinden ist es dasselbe Spiel. Die Meldung kommt erst, wenn ich im Server-Fenster "Enter" drücke...
Bild

nächstes Problem:
Wenn ich mir alle bestehenden Verbindungen Anzeigen lassen will (Befehl list), passiert zunächst nichts (siehe Bild)
Bild

Erst nachdem ich die Clienten Protokolle geschlossen habe kommt die Anzeige meiner Verbindungen (die nun ja nicht mehr stimmt...)
Bild

Ich weiß nicht, wo hier der Fehler liegt. Ich vermute, das hat was mit dem Threading zu tun...


Die Python Dateien sind hier angehängt:

https://github.com/attreyabhatt/Reverse ... hell%20v2)


Hoffentlich könnt ihr mir ein bisschen helfen!!

Vielen Dank =)
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Wie kommst du darauf, dass Socket-Programmierung simpel ist? Das ist sie nicht.
Auf Anhieb fällt auf, dass du (oder der von dem der Code stammt) nicht weiß, dass socket.recv(i) nicht i Bytes sondern garantiert nur 1 liefert. Das wird aber nicht beachtet.
Vergiss dass es global gibt. Da war dann auch der Punkt, wo ich mir den Code nicht weiter angeschaut habe.

Nimm etwas, das bereits etabliert ist, statt zu versuchen da mit Sockets etwas selbst zu bauen. Django oder Flask wären Frameworks für Web-Applikationen. Darüber könntest du eine entsprechende Schnittstelle anbieten.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Der verlinkte Code ist sehr schlecht. Da wird ausschließlich mit globalen Variablen gearbeitet, statt wirkliche Funktionen zu schreiben. Es wird, wie in 99.99% aller anderen Beispiele, die man so im Netz findet, nicht berücksichtigt, dass es sich bei TCP um Streams handelt, wo nicht unbedingt alle Bytes so gesendet und Empfangen werden, die es die Funktionsaufrufe glauben machen könnten.

Dort kann man also nur lernen, wie man es nicht macht, und Du wirst jetzt Mühe haben, das alles wieder zu vergessen und sauber von vorne anzufangen.

Einfache Client-Server-Anwendungen lassen sich, wie sparrow schon geschrieben hat, leicht mit HTTP umsetzen. Es gibt auch andere etablierte Protokolle zum Nachrichtenaustausch wie nanomsg, zeromq oder rabbitmq.
Lies Dich mal in diese Protokolle ein, und schau, welches davon für Dich richtig ist und nutze dann gut getestete fertige Bibliotheken, anstatt auf low-level-Niveau Dir etwas selbst zu schreiben.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@da1000: In den Bildern sind ja nur Textausgaben. Dafür bitte keine Bilder benutzen sondern den Text in den Beitrag kopieren. Bei Quelltext in Code-Tags.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
da1000
User
Beiträge: 4
Registriert: Donnerstag 24. Oktober 2019, 11:29

Guten Morgen,

Vielen Dank für eure Antworten.
Okay das holt mich jetzt wieder auf den Boden der Tatsachen zurück. Dachte ein-zwei Zeilen etwas umschreiben und - voila - Thema erledigt.

Gut, dann werd ich mich mal mit den von euch genannten Protokollen beschäftigen. Wird schon laufen ;)

Vielen Dank und Grüße
Antworten