WebSocket Server

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Wow, vielen Dank für deine Mühen!
Heute Morgen ist der Server abgeschmiert, seidem lasse ich ihn über die IDE laufen, um zu sehen an welcher Stelle er wieder hängen bleibt. Natürlch läuft der Server seitdem ohne Probleme ;)
Ich werde dein Code nach deinem Vorschlag morgen ändern, momentan spielen zu viele Leute. Da kann ich den Server nicht einfach beenden.
Aber sollte er heute Abend noch einmal abschmieren, werde ich CloseNetworkConnection heute noch auskommentieren.

Wirklich vielen Dank, dass du dich da so rein kniest!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Ich habe eine neue Version auf GitHub gepusht. Der Fehler sollte jetzt behoben sein, und clients werden auch korrekt getrennt.

Das Problem war, dass doch nicht sichergestellt wurde, dass die Client-ID, welche CloseNetworkConnection übergeben wird, noch gültig ist. Wobei hier die Hilfe nicht eindeutig ist, und nicht sagt, dass es verboten wäre eine Client-ID zu verwenden, welche durch eine Rückgabe von #PB_NetworkEvent_Disconnect als getrennt gekennzeichnet wurde (muss != darf):
Wenn ein Server ein #PB_NetworkEvent_Disconnect Ereignis empfängt, wird seine zugehörige Client-Verbindung automatisch geschlossen und CloseNetworkConnection() muss in diesem Fall nicht aufgerufen werden.
Das Problem ist nun gelöst, indem ich sicherstelle, dass NetworkServerEvent nie parallel mit anderen Netzwerkbefehlen aufgerufen wird. Vorher war es möglich, dass beim einem Aufruf von NetworkServerEvent die Client-ID ungültig gemacht wurde, was natürlich schlecht ist, wenn zur gleichen Zeit irgendwas mit diesem client gemacht wird. Was genau intern passiert kann ich nicht sagen, es kann sein, dass das Problem unabhängig vom Multithreading existiert. Also es reichen würde Netzwerkbefehle mit gerade abgelaufenen Client-IDs zu bombadieren, bis es crasht. Oder es kann sein, dass nur der gleichzeitige Zugriff auf Netzwerkbefehle Probleme macht, unabhängig ob die IDs noch gültig sind oder nicht. Letztendlich weiß Fred ob die Befehle ein Problem mit Multithreading haben, oder ob nur die Dokumentation angepasst werden muss.
mk-soft hat geschrieben:Das senden mit SendNetworkData oder SendNetworkString von einen anderen Thread auf einer nicht mehr vorhanden Connection Crash bei macOS
Ich habe deinen Thread im englischen Forum erst jetzt gesehen. Eventuell hilft es auch bei dir, den Zugriff auf Netzwerkfunktionen per Mutex einzuschränken.

Edit:

Ich hab mir gerade die englische Hilfe angesehen, da steht was anderes:
When a server receives a #PB_NetworkEvent_Disconnect event its associated client connection is automatically closed and CloseNetworkConnection() must not be called in this case.
Ist also nen typischer übersetzungsfehler: must not --> muss nicht anstatt darf nicht :/
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Super!
Muss ich gleich runterladen.
Kannst du mir die Zeile nennen, ab wann du Änderungen gemacht hast. Ich möchte gerne versuchen zu verstehen, was du da machst ;)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Hier sind die Änderungen: https://github.com/Dadido3/WebSocket_Se ... 177da55c08

Ich hab einfach nur den Mutex weiter "nach Außen" geschoben, sodass er NetworkServerEvent mit einschließt.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: WebSocket Server

Beitrag von mk-soft »

Da ich mir nicht sicher bin das intern alles Threaded ist, mache ich das mit den Events so.
Soll aber intern nach dem letzen Update so sein.

Code: Alles auswählen

  Repeat
      LockMutex(ServerMutex)
      Event = NetworkServerEvent(\ServerID)
      If Event
        ConnectionID = EventClient()
        keyConnectionID = Hex(ConnectionID)
      EndIf
      UnlockMutex(ServerMutex)
      Select Event
Den Fehler bei macOS konnte ich weiter einkreisen. Mal schauen was Fred dazu sagt.

Mit dem Module habe ich bis jetzt noch keine Probleme gehabt. Module NetworkTCP

Frage:
Kümmerst sich das Java WebSocket sich darum das die Daten bis 64kB vollständig einmalig übergeben werden, oder muss man sich selber darum kümmert das die Daten alle angekommen sind?
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

mk-soft hat geschrieben:Frage:
Kümmerst sich das Java WebSocket sich darum das die Daten bis 64kB vollständig einmalig übergeben werden, oder muss man sich selber darum kümmert das die Daten alle angekommen sind?
Ganz unabhängig von der Implementation, der WebSocket standard ist paketbasiert. Das heißt, alle gesendeten Pakete kommen in der Reihenfolge und Größe an, wie sie gesendet wurden. Und das entweder ganz oder garnicht. Auch die Größe eines Pakets ist quasi uneingeschränkt (~9,22 EB), aber in meiner lib habe ich ein Standardlimit von 10 MB pro Paket, das ist aber konfigurierbar. (Clients werden zwangsgetrennt, wenn das Limit überschritten wird)
mk-soft hat geschrieben:Da ich mir nicht sicher bin das intern alles Threaded ist, mache ich das mit den Events so.
Ich hatte gedacht, es stürzt dort auf der Client-Seite ab, wo kein Mutex vorhanden ist um NetworkClientEvent und SendNetworkData zu serialisieren. Oder hast du auf der Server-Seite trotz Mutex auch Probleme mit NetworkServerEvent auf MacOS? Aber vollkommen unabhängig davon muss Fred irgendwas beheben. Im Idealfall sollte die Netzwerklib korrekt Threadsafe sein.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: WebSocket Server

Beitrag von mk-soft »

Die Network Library ist ThreadSafe.

Habe nur bedenken beim Abfrage von den EventClient(), da dieser kein Parameter für die ServerID hat.
Daher mach ich nur ein Mutex bei Abruf des Network Events und dem zugehörigen Abfrage der ClientID.

Sonst habe ich keine Probleme die mit den anderen Network Funktionen, da bei diesen die ClientID oder ConnectionID mit angegeben werden muss.
Da läuft es ThreadSafe.

Das senden mit SendNetworkData verwende ich selber noch einmal ein eigenen Mutex.
Somit stelle ich sicher das über die gleiche ConntectionID nicht von unterschiedlichen Thread gleichzeitig gesendet werden kann.

Edit
Ausserdem überprüfe ich die Sendelänge, falls der Empfangs- oder Sende- Buffer überläuft. (size <= 64kB)

Code: Alles auswählen

      len = 0
      LockMutex(MutexSend)
      Repeat
        cnt = SendNetworkData(ConnectionID, SendBuffer + len, size - len)
        len + cnt
      Until len = size Or cnt < 0
      UnlockMutex(MutexSend)
Nur bei macOS scheint es ein Problem mit der CFSocket und Network RunLoop zu geben,
wenn man von einem anderen Thread zu schnell hintereinander sendet.
Add Link: FixSendNetworkData

P.S.
Mit diesen Module NetworkData habe ich über mehrere Rechner ein Leistungstest mit sehr gößen Daten durchgeführt und es kann zu KEINEN Fehler ;)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Hey Dadido3,

der Server läuft jetzt ohne Abstürze und sehr gut.
Aber ab und zu läuft sich jetzt der Server "heiss", die CPU ist dann auf fast 100% und nichts geht mehr. Da hilft dann nur ein Neustart.
Ich kann das leider an keinem "Ereignis" festmachen.
Ich kann damit leben, aber ich dachte mir, ich teile dir das mal als Feedback mit.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Gut zu wissen, dass es jetzt nicht mehr abstürzt.

Wäre es möglich den Server mit Debugger laufen zu lassen, und wenn er sich aufhängt das Programm anzuhalten und notieren an welcher Zeile das passiert?
(Eventuell ist es auch hilfreich das Programm mehrfach fortzusetzen und anzuhalten, um alle möglichen Stellen herauszufinden, wo das Programm in einer Schleife steckt.)

Auch die Programmanalyse könnte hilfreich sein, da werden die Zeilen und deren aufrufe gelistet.

Wenn ich ein wenig mehr informationen hätte, könnte ich das Problem wahrscheinlich auch beheben.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Hab leider dein Post erst jetzt gelesen.
Ja klar, kein Problem, ich lasse den Server die nächste Zeit in der IDE mit eingeschaltenem Debugger laufen.
Ich vermute allerdings, dass sich der Server in irgendeiner Leerlaufschleife befindet aus der er nicht rauskommt. Das werde ich wohl kaum mit einem Debugger sehen (oder doch?)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Antworten