Есть ли способ отключить клиент с SocketIO и буквально закрыть соединение? Итак, если кто-то подключен к моему серверу, и я хочу закрыть соединение между ними и моим сервером, как бы я это сделал?
Отключение клиента от сервера с помощью socket.io и nodejs
Ответ 1
Изменить: теперь это возможно
Теперь вы можете просто вызвать socket.disconnect()
на стороне сервера.
Мой оригинальный ответ:
Это еще не возможно.
Если вам это тоже нужно, прокомментируйте эту проблему.
Ответ 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()
Ответ 13
Проверяя сегодня утром, кажется, что это сейчас:
socket.close()
Ответ 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();
});