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ć?
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ć?
Odpowiedzi:
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?
Client.emit('disconnect')
już dzwonić ręcznie z ostatnimi wersjami socket.io, jest teraz strona serwera socket.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:
socket.emit('forceDisconnect');
Na serwerze:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
Zakładając nazwane gniazdo twojego gniazda, użyj:
socket.disconnect()
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 :)
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:
socket.close()
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
Socket.io używa wzorca EventEmitter do rozłączania / łączenia / sprawdzania pulsu, więc możesz to zrobić. Client.emit('disconnect');
To nie zadziałało dla mnie:
`socket.disconnect()`
To zadziałało dla mnie:
socket.disconnect(true)
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:
// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
console.log(data); // (4) server receives 'invalidAccessTokenEmitReceived' from client
socket.disconnect(true); // (5) force disconnect client
});
// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => {
// // (3) the client ack emits to server
// fn('invalidAccessTokenEmitReceived');
// });
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
const socketClient = require('socket.io-client');
let socket;
// Connect to server
socket = socketClient(url)
// When want to disconnect
socket = undefined;
Dodaj nowe połączenia gniazd do macierzy, a gdy chcesz zamknąć wszystko - zapętl je i rozłącz. (po stronie serwera)
var socketlist = [];
io.sockets.on('connection', function (socket) {
socketlist.push(socket);
//...other code for connection here..
});
//close remote sockets
socketlist.forEach(function(socket) {
socket.disconnect();
});