2012-08-04 13 views
15

Mam aplikację webową, która działa w przeglądarce. Ta aplikacja jest połączona z serwerem, który korzysta z websockets. Tak więc komunikacja między serwerem a moim klientem/przeglądarką oparta jest na stronach internetowych. Jeśli jakieś magiczne zdarzenie wystąpi na serwerze, niektóre usługi sieciowe wysyłają nowy XML/JSON do mojej aplikacji internetowej, a nowe dane zostaną wyświetlone.Skąd mam wiedzieć, czy połączenie jest aktywne z gniazdami internetowymi?

Ale jak ja, jako klient/przeglądarka, wiem, czy połączenie jest żywe? Powiedzmy, że nie otrzymuję żadnego nowego XML przez około 30 sekund. Skąd mam wiedzieć, czy połączenie jest zamknięte/zerwane/serwer jest w trybie offline, czy wszystko jest w porządku, ale na serwerze nie pojawiły się nowe zdarzenia magiczne.

Odpowiedz

18

3 sposoby:

  • polegać na TCP w celu wykrycia utraty łączności, która ostatecznie pop up w JS onClose imprezy
  • wyślij websocket pingi z serwera .. przeglądarek odpowie PONGS WS, utrata Łączność jest prawdopodobnie silniej wykrywana również po stronie klienta:
  • wysyłanie pulsu na poziomie aplikacji z przeglądarki do serwera, serwer musi mieć logikę, aby odpowiedzieć. nie można wywołać WS pingi z przeglądarkami (w JS) obiekt połączenia
+0

Czy nie ma nic zdefiniowanego w standardzie? czy muszę wykonać całą "pracę" ręcznie? – Gero

+0

Standard umożliwia wykrywanie i powiadamianie o punktach końcowych związanych z błędami połączeń TCP (które zwykle obejmują wiele przypadków problemów z serwerem). Jeśli chcesz móc wykryć awarie zanim TCP wykryje błąd lub warunki błędu, w których połączenie TCP jest żywe, ale sam serwer nie przetwarza wiadomości, musisz to zrobić ręcznie. – zaphoyd

+0

ok, rozumiem to, ale wydaje się nieco niejasne. Wygląda na 7 różnych dróg do Rzymu. – Gero

22

websocket ma readyState pole, które powie Ci, czy połączenie jest wciąż aktywne (from the dart documentation). ReadyState może być

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

Można również zdefiniować obsługi zdarzeń dla zdarzenia websocket close jeśli to jest coś chcesz obsługiwać (spróbuj połączyć się ponownie, etc).

+7

Stan ReadyState nie zmienia się po rozłączeniu – megawac

+1

Dla każdego, kto patrzy na powyższy komentarz: Z doświadczenia wiem, że zamknięcie gniazda za pomocą socket.close() zmieni stan gotowości – Brandon

+0

Tak, zgadzam się z Brandonem, gdy zamkniesz połączenie, pokazuje "3" –

Powiązane problemy