Daten von mehreren Clients an Server

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Kawalofski
User
Beiträge: 4
Registriert: Mittwoch 2. März 2016, 11:28

Python 2.5
Hallo,
habe in der Socket Programmierung nur geringe Kenntnisse (1 Client, 1 Server, Datenaustausch),
möchte nun aber Daten von mehreren Clients (max 5) an Server senden und weiss nicht wie ich das mit mehreren anstellen soll.

Das ist meine Aufgabe
1. Daten (nur ein Integer Wert 0-1000) sollen von den Clients in 10 Sekunden Abständen an den Server gesendet werden.
2. Clients sollen nur senden, ohne auf Antwort warten, unabhängig ob Server läuft oder nicht.
3. Auf dem Server befindet sich eine Python Oberfläche die die Daten im Hintergrund empfangen soll.
4. Die Server Oberfläche soll immer Bedienbar sein, egal ob Daten kommen oder nicht.

Wer kann mir da helfen, oder noch besser, hat diesbezüglich ein Beispiel

Vielen vielen Dank
Gruß Kawalofski
BlackJack

@Kawalofski: Die geringe Datenmenge (Punkt 1) und das der Client weder eine Antwort erwartet noch wirklich wissen muss ob der Server läuft oder nicht (Punkt 2) spricht ja schon fast für UDP. Bleibt nur noch die Frage ob auch bei laufendem Server ein Datum verloren gehen darf, oder ob in dem Fall wirklich 100%ig zugestellt werden muss.

Punkt 3 spricht erst einmal dafür den Server in einem Thread laufen zu lassen (`threading`-Modul). Ausser das GUI-Rahmenwerk bietet die Möglichkeit Socket-Kommunikation auch ereignisbasiert abzuwickeln. Das sollte man aber wiederum nur machen wenn es in Ordnung ist, dass der Server-Code vom GUI-Rahmenwerk abhängt.

Der Unterschied ob man nur einen Client oder fünf bedient, ist eigentlich gar nicht so gross. Man muss, falls man TCP verwendet, sicherstellen das die Clients sich nicht blockieren können, also am besten auch wieder einen Thread pro Client starten der den abarbeitet (falls man nichts ereignisbasiertes verwendet).

Warum Python 2.5? Das ist mittlerweile schon uralt. Wo ist denn so etwas noch das Standardpython? Eigentlich nur auf alten CentOS-Installationen und auf älteren NAS-Geräten oder Ähnlichem wo man das System nicht so einfach aktualisieren kann.
Kawalofski
User
Beiträge: 4
Registriert: Mittwoch 2. März 2016, 11:28

Datum kann ruhig verloren gehen, aufgrund der Empfangenen Daten kann ich feststellen von wem und wann.

Python 2.5? Es handelt sich bei den Client`s um CNC Steuerungen wo der Hersteller Python 2.5 vorschreibt,
weil alle anderen Python Anwendungen nur damit getestet sind.

Noch ein Hinweis
Egal ob ein Client oder der Server beendet wurde, nach einem Neustart müsste die Verbindung wieder automatisch aufgenommen werden.

auf den Clients läuft kein GUI!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kawalofski: wenn auch Daten verloren gehen dürfen, dann spricht eigentlich nichts mehr gegen UDP. Dann bist Du auch verbindungslos, es muß also nach einem Neustart nicht automatisch wieder eine Verbindung aufgebaut werden. Auch das Lesen am Server ist einfacher, da nur ein Thread für alle Clients gebraucht wird.

Code: Alles auswählen

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind(('', 33333))

while True:
    data, addr = sock.recvfrom(1024)
    print "received message:", data, addr

Code: Alles auswählen

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.sendto("17", ('192.168.56.103', 33333))
Kawalofski
User
Beiträge: 4
Registriert: Mittwoch 2. März 2016, 11:28

Hallo Sirius3,
vielen Dank, das funktioniert schon mal sehr gut.
mit while True: wird ja auf daten gewartet, aber genau das blockiert mir meine GUI Oberfläche!!!
Wie könnte ich das "warten auf Daten" im Hintergrund laufen lassen?
BlackJack

@Kawalofski: Du müsstest das nebenläufig ausführen. Allgemein geht das mit dem `threading`-Modul. Wenn dieser Server und die Oberfläche irgendwie interagieren sollen, dann müsstest Du schauen wie es mit der threadsicherheit aussieht, also was man bei dem verwendeten GUI-Rahmenwerk anstellen muss, damit das zuverlässig/sicher klappt.
Kawalofski
User
Beiträge: 4
Registriert: Mittwoch 2. März 2016, 11:28

Hmmm... jetzt hab ich nach threading`-Modul gestöbert und bin mit den verschiedensten Beispielen konfrontiert worden, und nun völlig verwirrt wie ich es bei mir anwenden soll!!!
Antworten