Richtiger Umgang mit Websocket

8

Ich habe eine Client-Server-WebSocket-Verbindung, die für etwa 40 Sekunden da sein sollte. Idealerweise sollte es für immer offen sein.

Der Client sendet kontinuierlich Daten an den Server und umgekehrt.

Im Moment benutze ich diese Sequenz:

%Vor%

Offensichtlich werden im Falle eines Fehlers die aktuellen Anforderungsdaten überhaupt nicht gesendet.

Um ehrlich zu sein, gibt es manchmal Fehler, dass Websocket immer noch im Verbindungsstatus ist. Diese Verbindung bricht häufig aufgrund von Netzwerkproblemen. Kurz gesagt, es funktioniert nicht perfekt.

Ich habe ein besseres Design gelesen: Warten für den readyState eines WebSockets, zu ändern, aber nicht alle Fälle, die ich bearbeiten muss.

Auch ich habe darüber gegoogelt aber konnte nicht die richtige Prozedur dafür bekommen.

Was ist der richtige Weg, um reguläre Daten über WebSockets zu senden, die diese Probleme wie Verbindungsunterbrechung usw. gut behandeln?

    
user5858 26.01.2016, 10:05
quelle

4 Antworten

2

Ein Ereignis, das Sie anscheinend nicht abdecken, ist geschlossen. Das sollte wirklich gut funktionieren, da es immer dann aufgerufen wird, wenn die Verbindung beendet wird. Dies ist zuverlässiger als ein Fehler, da nicht alle Verbindungsunterbrechungen zu einem Fehler führen.

    
GMchris 26.01.2016 10:17
quelle
1

Ich persönlich benutze Socket.IO , es ermöglicht die bidirektionale, ereignisbasierte Echtzeitkommunikation zwischen Client und Server.

Es ist ereignisgesteuert. Ereignisse wie

on connection :: socket.on('conection',callback);

und

on disconnect :: socket.on('disconnect',callback);

sind mit socket.io integriert, damit Sie Ihre Verbindungsprobleme lösen können. Ziemlich viel sehr einfach zu bedienen, besuchen Sie ihre Website, wenn Sie interessiert sind.

    
Jo E. 01.02.2016 17:24
quelle
1

Ich verwende ein zweischichtiges Schema auf dem Client: abstract-wrapper + websocket-client:

Die Verantwortlichkeiten des websocket-Clients interagieren mit einem Server, stellen die Verbindung wieder her und stellen Schnittstellen (event-emitter und einige Methoden) für abstract-wrapper bereit.

Der abstract-wrapper ist ein High-Level-Layer, der mit websocket-client interagiert, seine Ereignisse abonniert und aggregierende Daten , wenn die Verbindung vorübergehend fehlgeschlagen ist. Der abstract-wrapper kann jede Schnittstelle wie Promise, EventEmitter usw. auf die Anwendungsebene stellen.

Auf der Anwendungsebene arbeite ich nur mit abstract-wrapper und mache mir keine Gedanken über Verbindungs- oder Datenverluste. Zweifellos ist es eine gute Idee, hier Informationen über den Status der Verbindungs- und Datensendebestätigung zu haben, weil es nützlich ist.

Wenn es notwendig ist, kann ich zum Beispiel einen Code bereitstellen

    
Vladislav Churakov 02.02.2016 14:57
quelle
0

Dies ist anscheinend ein Serverproblem, kein Problem im Client.

Ich weiß nicht, wie der Server hier aussieht. Aber das war ein großes Problem für mich in der Vergangenheit, als ich an einem Websocket-basierten Projekt arbeitete. Die Verbindung würde kontinuierlich unterbrochen.

Also habe ich einen Websocket-Server in Java erstellt, und das hat mein Problem gelöst.

websockets hängen von vielen Einstellungen ab. Wenn Sie Servlets verwenden, sind die Einstellungen des Servlet-Containers wichtig. Wenn Sie php usw. verwenden, sind Apache- und PHP-Einstellungen wichtig, zum Beispiel wenn Sie einen Websocket-Server in php und php erstellen hat eine Standardzeit von 30 Sekunden, wird nach 30 Sekunden unterbrochen. Wenn keep-alive nicht gesetzt ist, bleibt die Verbindung nicht bestehen.

Was Sie als schnelle Lösung tun können, ist

  1. sendet Pings nach einer gewissen Zeit (zB 2 oder 3 Sekunden) an einen Server. Wenn ein Websocket getrennt wird, ist er dem Client bekannt, damit er onclose oder ondisconnect aufrufen kann. Ich hoffe, Sie wissen, dass es da ist Es gibt keine Möglichkeit herauszufinden, ob eine Verbindung unterbrochen wurde, außer dass etwas nicht gesendet wurde.
  2. Überprüfen Sie den Keep-Alive-Header des Servers
  3. Wenn Sie Zugriff auf den Server haben, dann sind das Timeouts usw.

Ich denke, das würde helfen

    
Aurangzeb 04.02.2016 05:20
quelle

Tags und Links