Seite 1 von 9

WebSocket Server

Verfasst: 09.02.2015 00:47
von Dadido3
Guten Tag,

hiermit stelle ich mein Modul zum erstellen eines WebSocket-Servers vor.
Mit WebSockets lassen sich ohne große Probleme dauerhafte Verbindungen zwischen Webseiten und Webservern herstellen.
Es ist damit möglich Webseiten daten zu schicken, ohne dass diese Anfragen senden müssen.

Anwendungen könnten sein:
  • Chat
  • Browserspiele
  • Kommunikation mit Webgadget
Getestete Betriebssysteme:
  • Windows 7 x64
  • Sollte aber auf jeder anderen Plattform laufen
Beispiel:
Es ist ein Beispiel in form einer Chat-Applikation im Repository vorhanden.
Der Client ist in Javascript und HTML geschrieben und der Server natürlich in PureBasic.

Über diesen Link kommt man direkt zum Client.
Der Client sollte sich sofort zu dem hier laufenden Server verbinden.
Falls diese nicht läuft kann jeder seinen eigenen Server kompilieren und starten.
Dazu muss einfach Example_Chat_Server.pb kompiliert und gestartet werden.
Wenn dann der Client geöffnet wird, wird dieser sich lokal verbinden.

Wichtige Befehle:
WebSocket-Server öffnen:

Code: Alles auswählen

*Server = WebSocket_Server::Create(8090, @WebSocket_Event())
Ereignisse als callback empfangen:

Code: Alles auswählen

Procedure WebSocket_Event(*Server, *Client, Event, *Event_Frame.WebSocket_Server::Event_Frame)
  Select Event
    Case WebSocket_Server::#Event_Connect
      PrintN(" #### Client connected: " + *Client)
      
    Case WebSocket_Server::#Event_Disconnect
      PrintN(" #### Client disconnected: " + *Client)
      ; !!!! Ab dem Moment bei dem dieses Ereignis eintritt ist der *Client nicht mehr gültig !!!!
      
    Case WebSocket_Server::#Event_Frame
      PrintN(" #### Frame received from " + *Client)
      
      ; #### OpCode stellt die Art des Frames dar.
      ; #### Entweder Text, Binär-Daten, Ping-Frames oder anderes.
      ; #### Wichtig für den Endanwender sind meist nur die Text- und Binärframes.
      Select *Event_Frame\Opcode
        Case WebSocket_Server::#Opcode_Ping
          Debug "Client sent a ping frame"
        Case WebSocket_Server::#Opcode_Text
          Debug "Text received: " + PeekS(*Event_Frame\Payload, *Event_Frame\Payload_Size, #PB_UTF8|#PB_ByteLength)
        Case WebSocket_Server::#Opcode_Binary
          ; *Event_Frame\Payload contains the data, *Event_Frame\Payload_Size is the size of the data in bytes
      EndSelect
      
  EndSelect
EndProcedure
Textframe senden:

Code: Alles auswählen

WebSocket_Server::Frame_Text_Send(*Server, *Client, "Hello Client!")
WebSocket-Server schließen:

Code: Alles auswählen

Free(*Server)
Dateien: Viel Spaß damit.

Re: WebSocket Server

Verfasst: 09.02.2015 22:36
von Kiffi
Vielen Dank dafür! :allright:

Grüße ... Peter

Re: WebSocket Server

Verfasst: 16.02.2015 17:19
von dige
Wow! Besten Dank :-) Dann lege ich NodeJS erstmal wieder zur Seite..

Re: WebSocket Server

Verfasst: 24.10.2019 10:45
von stevie1401
Ich habe festgestellt, dass der Web-Socket-Server unter Linux (Ubuntu und Debian) gerne ankommende Strings "verschluckt".
Unter Windows läuft alles soweit prima.
Woran kann das liegen?

Re: WebSocket Server

Verfasst: 24.10.2019 12:58
von Dadido3
Woran das liegen könnte kann ich jetzt auch nicht sagen, es sollte aber funktionieren.

Hast du einen kurzen Beispielcode, welcher das Problem zeigt? Und hat das Chat-Beispiel auch dieses Problem?
Ohne es hier reproduzieren zu können, kann ich es schlecht beheben.

Re: WebSocket Server

Verfasst: 24.10.2019 23:01
von stevie1401
Nein, leider nicht. Der Code, den ich benutze ist sehr, sehr gross. Aber ich benutze als Grundlage deinen Code, sodass du das genau mit diesem auch testen kannst. Das Problem ist, ich kann es an nichts festmachen. mal geht es recht lange gut, dann verschluckt er wieder Text. Nur unter Linux. Unter Windows (x64 und x86) geht alles problemlos. An der Länge der gesendeten Strings liegt es jedenfalls NICHT.

Re: WebSocket Server

Verfasst: 30.10.2019 14:29
von Dadido3
Ich hab jetzt mal das Chat-Beispiel unter linux gestartet, und ein wenig getestet. Bis jetzt konnte ich das Problem noch nicht reproduzieren.

Wie oft tritt es denn auf. Also in welchen Zeitabständen, oder ab wie vielen Nachrichten?
Hast du bereits überprüft ob Nachrichten auch im Chat-Beispiel verloren gehen? Auch könntest du versuchen alles Empfangene in eine Datei zu schreiben, um dann später zu festzustellen, ob die daten wirklich ankamen. Dafür musst du einfach WriteData() bei den beiden ReceiveNetworkData-Aufrufen hinzufügen:

Code: Alles auswählen

Result = ReceiveNetworkData(*Client\ID, *Client\HTTP_Header\Data + *Client\HTTP_Header\RX_Pos, 1)
If Result > 0
  WriteData(#Some_File, *Client\HTTP_Header\Data + *Client\HTTP_Header\RX_Pos, Result)
  ...

Code: Alles auswählen

Result = ReceiveNetworkData(*Client\ID, *Client\RX_Frame()\Data + *Client\RX_Frame()\RxTx_Pos, Receive_Size)
If Result > 0
  WriteData(#Some_File, *Client\RX_Frame()\Data + *Client\RX_Frame()\RxTx_Pos, Result)
  ...
Wie sieht es mit der Gegenseite aus? Ist diese in js, PureBasic oder sonstwas geschrieben? Macht es auch einen Unterschied wo der Client läuft?

Re: WebSocket Server

Verfasst: 13.11.2019 14:17
von stevie1401
Hey Dadido3, ich habe es noch einmal ausgiebig getestet.
Unter Windows funktioniert dein Code zu 100%
Unter Linux ist es nicht leicht den Fehler zu bemerken:
Ist der Client im eigenen Netzwerk, dann treten die Empfang-Probleme seitens des Server nicht so oft auf.
Viel deutlicher ist es festzustellen, wenn man den Client auf eine "richtige" Homepage irgendwo im Internet legt.
Dann ist sehr schnell festzustellen, dass der Linux-Socket-Server öfter Web-Socket-Strings nicht empfängt.
Dabei ist es unerheblich wie oft oder wie schnell Strings an den Server gesendet werden. Zumindest habe ich keine Regelmäßigkeit oder Ursache feststellen können. Ich kann nur bemerken, DASS es einfach so ist.
Du kannst wirklich deinen eigenen Code verwenden, um zu testen, da ich ja deinen Code benutze. Ich habe ihn nicht verändert.

Re: WebSocket Server

Verfasst: 13.11.2019 14:41
von HeX0R
Hast Du denn die ankommenden Pakete mal mitgeloggt, wie Dadido vorgeschlagen hat?
Die Frage, die ich mir stelle ist, ob es an der Empfangs- oder Sendeseite liegt, weil ich gesehen habe, das die Sendeseite kein wirkliches Errorhandling hat.

Re: WebSocket Server

Verfasst: 13.11.2019 16:49
von stevie1401
Ich habe jetzt vom Client aus per Timer jede Sekunde einen String gesendet ("Dies ist Sting "+str(StingNr))

In unregelmäßigen Abständen kommt der String bei Linux NICHT an. Bei Windows kommen alle Strings an.

Wenn man jetzt noch neben dem Timer ab und zu etwas richtig in den Chat schreibt, dann merkt man es noch eher, dass nicht alles beim Server ankommt (unter Linux)