Verbindung übergeben?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
pedator92
User
Beiträge: 3
Registriert: Montag 16. Januar 2017, 11:02

Hallo Leute.
Ich hoffe ihr könnt mich in die richtige Richtung anstoßen,
es geht darum das eine Verbindung mit dem Server eingegangen wird und dieser eine Nachricht erhält. Aus dieser Nachricht soll dann der thread bestimmt werden in welcher der Client geschoben werden soll.
wahrscheinlich ist die Lösung so einfach das ich nicht drauf komme.
BlackJack

@pedator92: Wahrscheinlich. Allerdings müsstest Du dazu wahrscheinlich das Problem besser beschreiben, denn zumindest ich habe nicht verstanden was Du machen möchtest, beziehungsweise müsste da jetzt anfangen zu raten was es bedeuten soll. Zum Beispiel ein Thread in der Client verschoben werden soll, heisst doch ziemlich wahrscheinlich Thread in dem auf dem Server die Behandlung der Verbindung mit einem Client verschoben werden soll‽
pedator92
User
Beiträge: 3
Registriert: Montag 16. Januar 2017, 11:02

Verständlich ausdrücken konnte ich mich noch nie :lol: .
Also:
Server startet und wartet auf die Verbindung>
Client verbindet sich mit den Server >
Client übermittelt Nachricht an Server >
Soweit funktioniert alles gut.
Da die Anwendung ja nicht nur für eine "Gruppe" ist sondern für mehrere "Gruppen", sollen die einzelnen Verbindung in ihren jeweiligen Thread geschoben/übergeben werden.
bsp.
Client 1 möchte in Raum 1
Client 2 möchte auch in Raum 1
Client 3 möchte in Raum 2
Client 4 möchte auch in Raum 1
Raum 1 ist dann "Thread 4"
Raum 2 ist dann "Thread 5"
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Ein Thread für alle Räume sollte genügen.
Du müsstest eher ein Objekt erstellen,
welches speichert wo sich wer befindet
und aus welchem Raum wer Nachrichten schreibt.

RAUM1 = Dieter, Klaus, Paul
RAUM2 = Dieter, Klaus, Detlef

Dieter schreibt in Raum1 und sendet die MSG an den Server.
Server erkennt Raum1 und sendet MSG von Dieter an Klaus, Paul.
Fertig.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Nach deiner Beschreibung zu urteilen suchst du so etwas:

https://gist.github.com/owainlewis/3217710

Chat server & Chat client in weniger als 68 Zeilen ;)
pedator92
User
Beiträge: 3
Registriert: Montag 16. Januar 2017, 11:02

Ich hatte vergessen zu schreiben das es sich um eine Serveranwendung für mein Spiel handelt, welches einen Multiplayer bekommen soll.
Ich steh eigentlich nur bei der Zuweisung der Verbindungen auf dem Schlauch.
Jeder Thread fungiert hier als Raum und wird danach auch wieder geschlossen wenn die Runde vorbei ist.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@pyHoax: Man sollte, bevor man irgendetwas verlinkt, vielleicht grob schauen, ob das passt. Von einem Chat sind die 68 Zeilen noch weit entfernt und wie so oft, ist die Behandlung von Sockets fehlerhaft. Echo-Server wäre besser und der Code so nicht empfehlenswert.

@pedator92: ohne Deinen Code zu kennen, ist es wirklich unmöglich, Dir zu helfen. Sockets hängen am Prozess, sind also für alle Threads verfügbar. Kommunikation findet normalerweise über Queues zwischen den Threads statt. Da kann mal also Socket-Objekte einfach hin- und herschieben.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Sirius3 hat geschrieben:@pyHoax: Man sollte, bevor man irgendetwas verlinkt, vielleicht grob schauen, ob das passt. Von einem Chat sind die 68 Zeilen noch weit entfernt und wie so oft, ist die Behandlung von Sockets fehlerhaft. Echo-Server wäre besser und der Code so nicht empfehlenswert.
Mal abgesehen davon das ich jetzt erst verstanden habe was gesucht wird, tut der Codeschnipsel doch genau das was er verspricht. (Auch wenn er OT ist) Es ist eine rudimentäre implementation eines Chatservers. Ein Echo Server sendet die Nachrichten nur an den versenden Client zurück, dieser Server sendet die Nachricht an alle verbunden Clients.


Um das Problem aufzuböseln.

Er hat Räume die als Threads implementiert sind.
Die Räume existieren bereits, wenn ein User sich verbindet.
Jeder User wird einen Raum zugeordnet, in dem die Verbindung dem Raum/Thread zugewiesen werden soll.
Es wird ein extra Thread benötigt um Netzwerkverbindungen zuerstellen.
Um von einen Thread informationen an einen Anderen Thread zu übergeben wird eine entsprechend Fredsichere Communication benötigt. (from queue import Queue)

Aus Interesse.. was ist mit dem socket handling in dem OT Codeschnippsel nicht in Ordnung ?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@pyHoax: es wird zwar ein Attribut "users" definiert, aber nie benutzt; bleibt also ein Echo-Server. Zeile 12: host ist der falsche Name, es handelt sich beim ersten Parameter von .bind um ein Gateway. Zeile 23: sys.exit nie irgendwo verschachtelt benutzen. Wenn man mit dem Socket-Error nichts sinnvolles anzufangen weiß, auch nicht abfangen. Zeile 32: hier wird plötzlich mit + ein String zusammengestückelt. Zeile 34: .recv liefert 1 bis 1024 Bytes, und nicht zwangsläufig die komplette Client-Nachricht. Bei einem Echo-Server nicht katastrophal, aber für jede andere Anwendung ein Fehler. Zeile 39 wird nie erreicht. Zeile 42: hier sollte doch der wirkliche Port ausgegeben werden. Zeile 46: da die Threads nicht dämonisiert sind, ist der Server darauf angewiesen, dass wirklich alle Clienten von sich aus die Verbindung schließen, damit auch der Server beendet wird. Zeile 63: es wird die run-Methode direkt aufgerufen -> Endlosschleife. .start wäre wohl gemeint gewesen.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Ja also wirklich sauber ist er nicht.
Sirius3 hat geschrieben:@pyHoax: es wird zwar ein Attribut "users" definiert, aber nie benutzt;
Für die Grundfunktionalität ist der User nicht notwendig ... warum der da steht kann ich nur spekulieren.
bleibt also ein Echo-Server. Zeile 12: host ist der falsche Name, es handelt sich beim ersten Parameter von .bind um ein Gateway.
Wenn sich mein Kollege fragt wo mein kleiner Adolf beim benennen von Variablen herkommt verweise ich auf diesen Forum ;)
Es gibt einfach Leute die sind da nicht so kleinlich.
Zeile 23: sys.exit nie irgendwo verschachtelt benutzen. Wenn man mit dem Socket-Error nichts sinnvolles anzufangen weiß, auch nicht abfangen.
Ja ist schon schlimm, doch zur kleinen Entlastung des Autors: 'sys.exit in einen Thread beendet diesen Thread und nicht den Prozess'
Zeile 32: hier wird plötzlich mit + ein String zusammen-gestückelt.
Nicht schön. macht dennoch was es soll.
Zeile 34: .recv liefert 1 bis 1024 Bytes, und nicht zwangsläufig die komplette Client-Nachricht.
Das läuft doch in einer Endlosschleife, wenn die Nachricht länger als 1024 Bytes ist, wird der Rest bei der nächsten Abfrage gelesen und ausgegeben.
pyHoax hat geschrieben: ... gübel..was macht er denn da .. hmm, nö sendall macht was anderes.. murmel.., .. und das .. uiuiui .. .. und dies hier ist Sirius3 noch gar nicht aufgefallen.... *facepalm*..
DA bleibt nur zu sagen : 'Sorry mea culpa '
Sah auf Anhieb besser aus als es ist.. (und ich muss im neuen Jahr auch noch mit Codereview beginnen, kein gutes Omen)


Wenn ich Lust & Zeit habe schreib ich ihn Heute Abend korrekt und neu .. in weniger als 68 Zeilen.
Und dann noch eine Fadenlose Python3 Variante mit Generator Ausdrücken und async from / async wait (wollte ich schon immer mal austesten)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@pyHoax: ein Name, der etwas falsches suggeriert ist eben nicht nur ein etwas unpassender Name, sondern führt beim Leser zu einer falschen Vorstellung, die dann zu falschem Verständnis und letztendlich zu fehlerhaftem Code führt. Das sieht man leicht daran, dass man unendlich viel Code findet, wo jemand einen Bind auf localhost macht und sich wundert, warum der Server nicht im Netz ansprechbar ist. Da bin ich gerne kleinlich, wenn ich dadurch Fehler verhindere.
pyHoax hat geschrieben:Ja ist schon schlimm, doch zur kleinen Entlastung des Autors: 'sys.exit in einen Thread beendet diesen Thread und nicht den Prozess'
»sys.exit« wird aber im Hauptthread aufgerufen.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

@pyHoax: ein Name, der etwas falsches suggeriert ist eben nicht nur ein etwas unpassender Name, sondern führt beim Leser zu einer falschen Vorstellung, die dann zu falschem Verständnis und letztendlich zu fehlerhaftem Code führt
Ein Host ist im Netzwerkjargon jedes Netzwerkinterface .. auch das Loopback device 'localhost'.

Ich kann nicht erkennen wie durch das benennen der Variable 'Gateway' (Eine Bezeichnung die ich in diesem Kontext nicht via google finden konnte ) das Problem minimiert wird das jemand seinen Socket an den 'localhost' bindet.

Da bleib ich lieber bei Bezeichnungen die geläufig sind.
Antworten