Czy istnieje sposób na odłączenie klienta za pomocą SocketIO i dosłowne zamknięcie połączenia? Więc jeśli ktoś jest podłączony do mojego serwera i chcę zamknąć połączenie między nim a moim serwerem, jak mam to zrobić?
117
Edycja: jest to teraz możliwe
Możesz teraz po prostu zadzwonić socket.disconnect()
po stronie serwera .
Moja pierwotna odpowiedź:
Nie jest to jeszcze możliwe.
Jeśli również tego potrzebujesz, zagłosuj / skomentuj w tej sprawie .
iptables
), tym więcej zasobów zaoszczędzisz. W większości przypadków po prostu wyrzucenie klienta powinno wystarczyć, ponieważ socketio nie łączy się tak szybko, a jeśli ktoś naprawdę chce cię zrobić, to i tak ma inne sposoby (np. Pobieranie stron od ciebie).socket.disconnect()
może być używany tylko po stronie klienta, a nie po stronie serwera.Client.emit('disconnect')
wyzwala zdarzenie rozłączenia na serwerze, ale nie rozłącza skutecznie klienta. Klient nie wie o rozłączeniu.Pozostaje więc pytanie: jak zmusić klienta do odłączenia się od serwera?
źródło
Client.emit('disconnect')
już dzwonić ręcznie z ostatnimi wersjami socket.io, jest teraz strona serwerasocket.disconnect()
(zobacz moją odpowiedź).socket.disconnect()
można jej używać również po stronie serwera.disconnect()
funkcji?Czy jest jakiś powód, dla którego serwer nie może wysłać wiadomości do klienta, która powoduje wywołanie funkcji rozłączenia?
Na kliencie:
Na serwerze:
źródło
Zakładając nazwane gniazdo twojego gniazda, użyj:
źródło
Dla tych, którzy znaleźli to w Google - teraz jest na to rozwiązanie:
Socket.disconnect()
kopie klienta (po stronie serwera). Klient nie ma szans na pozostanie w kontakcie :)źródło
disconnect
zdarzenia gniazda, aby dowiedzieć się, czy zostało rozłączone. Może to być równieżclose
wydarzenie, nie jestem do końca pewien. Więcej informacji na ten temat można znaleźć w dokumentacji socket.io.Po sprawdzeniu dzisiejszego ranka wydaje się, że jest teraz:
https://socket.io/docs/client-api/#socket-close
źródło
W moim przypadku chciałem zerwać podstawowe połączenie, w którym to przypadku musiałem zadzwonić,
socket.disconnect(true)
jak widać, jest potrzebne ze źródła tutajźródło
client._onDisconnect()
powinno działaćźródło
Socket.io używa wzorca EventEmitter do rozłączania / łączenia / sprawdzania pulsu, więc możesz to zrobić.
Client.emit('disconnect');
źródło
To nie zadziałało dla mnie:
To zadziałało dla mnie:
Przekazanie
true
spowoduje zamknięcie podstawowego połączenia z klientem, a nie tylko przestrzeni nazw, do której klient jest podłączony do dokumentacji Socket IO .Przykładowy przypadek użycia: klient połączył się z serwerem gniazda sieciowego z nieprawidłowym tokenem dostępu (token dostępu przekazany do serwera gniazda sieciowego z parametrami połączenia). Serwer gniazda sieciowego powiadamia klienta, że zamierza zamknąć połączenie z powodu jego nieprawidłowego tokenu dostępu:
źródło
Używam
client.emit('disconnect')
+client.removeAllListeners()
dla podłączonego klienta do ignorowania wszystkich zdarzeń po rozłączeniuźródło
Używam po stronie klienta
socket.disconnect();
źródło
posługiwać się :
nie używać :
źródło
Możesz to zrobić
socket = undefined
w wymazaniu, które gniazdo podłączyłeś. Więc kiedy chcesz się połączyć z gniazdem (url)Więc to będzie wyglądać tak
źródło
Dodaj nowe połączenia gniazd do macierzy, a gdy chcesz zamknąć wszystko - zapętl je i rozłącz. (po stronie serwera)
źródło