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.
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

WebSocket Server

Beitrag 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.
Zuletzt geändert von Dadido3 am 28.02.2018 21:23, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: WebSocket Server

Beitrag von Kiffi »

Vielen Dank dafür! :allright:

Grüße ... Peter
Hygge
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: WebSocket Server

Beitrag von dige »

Wow! Besten Dank :-) Dann lege ich NodeJS erstmal wieder zur Seite..
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag 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?
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 »

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.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag 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.
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 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?
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: WebSocket Server

Beitrag 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.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag 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)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Antworten