Отключение клиента от сервера с помощью socket.io и nodejs

Есть ли способ отключить клиент с SocketIO и буквально закрыть соединение? Итак, если кто-то подключен к моему серверу, и я хочу закрыть соединение между ними и моим сервером, как бы я это сделал?

Ответ 2

socket.disconnect() может использоваться только на стороне клиента, а не на стороне сервера.

Client.emit('disconnect') запускает событие разъединения на сервере, но фактически не отключает клиента. Клиент не знает об отключении.

Итак, остается вопрос: как заставить клиента отключиться от серверной стороны?

Ответ 3

Любая причина, по которой сервер не может передать сообщение клиенту, который заставляет его вызывать функцию разъединения?

На клиенте:

socket.emit('forceDisconnect');

На сервере:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});

Ответ 4

Предполагая, что ваш сокет с именем socket, используйте:

socket.disconnect()

Ответ 5

Для тех, кто нашел это в google - для этого есть решение:

Socket.disconnect() удаляет клиента (на стороне сервера). Нет шансов, что клиент останется на связи:)

Ответ 6

В моем случае я хотел снести базовое соединение, в котором я должен был позвонить socket.disconnect(true), как вы можете видеть, из источника здесь

Ответ 7

client._onDisconnect() должен работать

Ответ 8

Socket.io использует шаблон EventEmitter для отключения/подключения/проверки heartbeats, чтобы вы могли это сделать. Client.emit('disconnect');

Ответ 9

Это не сработало для меня:

'socket.disconnect()' 

Это сработало для меня:

socket.disconnect(true)

Передача true закроет основополагающее соединение с клиентом, а не только пространство имен, к которому клиент подключен к документации Socket IO.


Пример использования: клиент подключился к серверу веб-сокетов с недействительным токеном доступа (токен доступа был передан серверу веб-сокетов с параметрами соединения). Сервер веб-сокетов уведомляет клиента о том, что он собирается закрыть соединение, из-за его неверного маркера доступа:

// (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');
// });

Ответ 10

Я использую client.emit('disconnect') + client.removeAllListeners() для подключенного клиента для игнорирования всех событий после отключения

Ответ 11

Я использую на стороне клиента socket.disconnect();

client.emit('disconnect') didnt work for me

Ответ 12

использовать:

socket.Disconnect()//нормально

не использовать:

socket.disconnect()

Ответ 14

Добавьте новые соединения сокетов к массиву, а затем, когда вы хотите закрыть все - пропустить их и отключить. (на стороне сервера)

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();                      
    });