2012-08-04 5 views
15

Ich habe eine Webapp, die in einem Browser ausgeführt wird. Diese Webanwendung ist mit einem Server verbunden, der Websockets verwendet. Die Kommunikation zwischen dem Server und meinem Client/Browser basiert also auf Websockets. Wenn ein magisches Ereignis auf dem Server auftritt, sendet ein Webservice ein neues XML/JSON an meine Webapp und die neuen Daten werden angezeigt.Woher weiß ich, ob die Verbindung mit Websockets besteht?

Aber wie weiß ich als Client/Browser, ob die Verbindung noch besteht? Nehmen wir an, ich bekomme für ca. 30 Sekunden kein neues XML. Wie würde ich wissen, ob die Verbindung geschlossen/unterbrochen/Server offline ist oder alles in Ordnung ist, aber auf dem Server selbst kein neues magisches Ereignis aufgetreten ist.

Antwort

18

3 Möglichkeiten:

  • verlassen sich auf TCP Verlust der Verbindung zu erkennen, die letztlich in JS OnClose Ereignis
  • senden WebSocket Pings vom Server Pop-up wird .. Browser wird mit WS Pongs antworten, Verlust der Konnektivität ist wahrscheinlich auch auf Client-Seite
  • robuster erkannt App-Level Heartbeats vom Browser zum Server senden, müssen Server Logik zu antworten. Sie können nicht WS Pings von Browsern (in JS) auslösen
+0

Ist im Standard nichts definiert? Oder muss ich die ganze "Arbeit" manuell erledigen? – Gero

+0

Der Standard bietet eine Möglichkeit, Endpunkte von TCP-bezogenen Verbindungsfehlern zu erkennen und zu benachrichtigen (was tendenziell zu vielen Serverproblemen führt). Wenn Sie in der Lage sein möchten, Fehler zu erkennen, bevor TCP dies feststellt, oder Fehlerzustände, bei denen die TCP-Verbindung aktiv ist, aber der Server selbst keine Nachrichten verarbeitet, müssen Sie dies manuell tun. – zaphoyd

+0

ok ich verstehe es, aber es scheint ein bisschen vage. Es sieht aus wie 7 verschiedene Straßen nach Rom. – Gero

22

A websocket Verbindungsobjekt hat ein readyState Feld, die Ihnen sagen, ob die Verbindung noch aktiv (from the dart documentation) ist. Die Readystate kann entweder

0 - connection not yet established 
1 - conncetion established 
2 - in closing handshake 
3 - connection closed or could not open 

Sie können auch einen Ereignishandler für das WebSocket close Ereignis definieren, ob dies etwas ist, dass Sie (versuchen zu verbinden, usw.) zu handhaben möchten.

+7

Der readyState ändert sich nicht beim Trennen – megawac

+1

Für jeden Blick auf den obigen Kommentar: Nach meiner Erfahrung, den Socket mit socket.close() zu schließen, wird den Bereitzustand ändern – Brandon

+0

Ja, ich stimme Brandon zu, wenn Sie die Verbindung schließen zeigt "3" –