Rozglądałem się, aby wdrożyć niezawodny mechanizm odzyskiwania połączenia z WebSocket.Niezawodne wykrywanie stanu połączenia z siecią WebSocket
Po pewnym dochodzeniu odkryłem, że jednym ze sposobów jest wysyłanie sygnałów dźwiękowych do serwera (ping/pong) i sprawdzanie, czy otrzymam cały pong w ograniczonym czasie.
Zatem albo jeśli połączenie jest rzeczywiście w dół lub jest to bardzo powolny byłoby uznać odłączony jeśli pong limity czasu oczekiwania, a kod powinien zadzwonić WebSocket.close()
.
Pod koniec tego dnia zadaję to pytanie, aby zweryfikować przepływ pracy połączenia i ponownego połączenia za pomocą WebSockets i sprawdzić, czy czegoś brakuje.
To znaczy, moje pytanie brzmi: jest to właściwy i niezawodny przepływ pracy w celu wdrożenia mechanizmu ponownego łączenia WebSockets?
Tak, masz rację (i dzięki za twoje "potwierdzenie"). BTW, istnieje mobilny przypadek użycia, gdzie wysyłanie pingów co 20 sekund (na przykład) ma wpływ na baterię. W moim przypadku, ponieważ nie używam WebSockets do wprowadzania danych przez użytkownika, ale dla wypychania serwera, chcę zauważyć użytkownika, że połączenie ma problemy tak szybko, jak to możliwe. –
Możesz wykryć opóźnienie sieci wysyłając polecenie ping ze znacznikiem czasu i wykonując echo serwera w pongu. Ale jeśli komunikacja zostanie przerwana (tj. Bez właściwego zakończenia TCP), trudno powiedzieć, że jest ona odcięta, dopóki nie spróbujesz wysłać czegoś: http://blog.stephencleary.com/2009/05/detection-of-half-open -dropped.html – vtortola
@vtrola Jest to bardzo ciekawy artykuł (dlaczego nie dodasz go do swojej odpowiedzi jako referencji?). BTW, nie jestem pewien, czy rozumiem pierwsze rozwiązanie * Prawidłowych metod wykrywania zerwanych połączeń *. Rozumiem, że chodzi o wysłanie pustej wiadomości (komunikat "keepalive") i czekanie na określony czas, a jeśli nie otrzymasz odpowiedzi w pewnym momencie, połączenie zostanie uznane za utracone. –