Re: WebSocket Server
Verfasst: 02.04.2025 16:41
Leider habe ich hier kein Spiderbasic und kann den Code nicht testen. Aber ich habe folgenden Code um den Server zu testen:stevie1401 hat geschrieben: 02.04.2025 13:05 Ich habe mit Spiderbasic einen Code geschrieben, der viele Clients anmeldet und die dann etwas senden.
Wenn ich während die Clients sich anmelden das Browserfenster von der Spiderbasic-App schliesse, dann verabschiedet sich der Webserver ins Nirvana.
Im unteren Beispiel soll das Spider-Client-Programm 400 Clients anmelden. Im Debugfenster des Browsers sehe ich welcher Client schon angemeldet ist.
Wenn ich jetzt mittendrin, zum z.B. bei Client 100 das Browserfenster einfach schließe, verabschiedet sich der Server.
Ich habe dies mit allen Servern getestet, dem Threadlosen und die beiden aktuellen mit Threads.
https://github.com/Dadido3/WebSocket_Se ... StressTest
Hiermit konnte ich aber auch mit bis zu 1000 Clients, welche alle connecten, verschiedene Nachrichten senden/empfangen und reconnecten, keinen Crash herbeiführen. Eventuell kannst du ja mal mit deinem Spiderbasic-Code versuchen StressTest.pb zum Absturz zu bringen. Der StressTest.pb Testserver macht nichts anderes als Verbindungen entgegenzunehmen und empfangene Websocket-Pakete wieder zurückzusenden.
stevie1401 hat geschrieben: 02.04.2025 13:05 Ich habe auch festgestellt, dass die
Procedure Frame_Text_Send(*Object.Object, *Client.Client, Text.s)
NICHT prüft, ob es den Client an den es senden soll überhaupt gibt.
Ob es dafür eine Lösung gibt?
Code: Alles auswählen
Procedure Frame_Text_Send(*Object.Object, *Client.Client, Text.s)
Code: Alles auswählen
...
Case WebSocket_Server::#Event_Disconnect
PrintN(" #### Client disconnected: " + *Client)
; !!!! From the moment you receive this event *Client must not be used anymore !!!!
...
Eventuell könntest du zum Debuggen mal den *Client mitloggen. Verändere dafür einfach mal das Include auf folgende Weise:
Code: Alles auswählen
Procedure Frame_Send(*Object.Object, *Client.Client, FIN.a, RSV.a, Opcode.a, *Payload, Payload_Size.q)
PrintN("Called Frame_Send on Client " + *Client)
...
EndProcedure
Code: Alles auswählen
...
; #### Event: Client connected and handshake was successful.
If *Client\Event_Connect
PrintN("New connection from Client " + *Client)
...
Code: Alles auswählen
...
; #### Delete the client and all its data.
PrintN("Starting to invalidate Client " + *Client)
ClientQueueRemove(*Object, *Client)
Client_Free(*Client)
ChangeCurrentElement(*Object\Client(), *Client)
DeleteElement(*Object\Client())
PrintN("Invalidated Client " + *Client)
Break
...