Есть ли способ отключить клиента с SocketIO и буквально закрыть соединение? Итак, если кто-то подключен к моему серверу, и я хочу закрыть соединение между ним и моим сервером, как я могу это сделать?
Есть ли способ отключить клиента с SocketIO и буквально закрыть соединение? Итак, если кто-то подключен к моему серверу, и я хочу закрыть соединение между ним и моим сервером, как я могу это сделать?
Ответы:
Изменить: теперь это возможно
Теперь вы можете просто позвонить socket.disconnect()
на стороне сервера .
Мой первоначальный ответ:
Пока это невозможно.
Если вам это тоже нужно, проголосуйте / прокомментируйте этот вопрос .
iptables
), тем больше ресурсов вы сэкономите. В большинстве случаев достаточно просто пнуть клиента, так как socketio не подключается так быстро, и если кто-то действительно хочет сделать DoS-атаку на вас, у них все равно есть другие способы (например, загрузка страниц от вас).
socket.disconnect()
может использоваться только на стороне клиента, но не на стороне сервера.
Client.emit('disconnect')
запускает событие отключения на сервере, но не отключает клиента. Клиент не знает об отключении.
Таким образом, остается вопрос: как заставить клиента отключиться от сервера?
Client.emit('disconnect')
последних версиях socket.io вам больше не нужно вызывать вручную, теперь есть серверная часть socket.disconnect()
(см. Мой ответ).
socket.disconnect()
можно использовать и на стороне сервера.
disconnect()
функции?
Есть ли причина, по которой сервер не может отправлять клиенту сообщение, которое заставляет его вызывать функцию отключения?
На клиенте:
socket.emit('forceDisconnect');
На сервере:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
Проверяя сегодня утром, выясняется, что сейчас:
socket.close()
Предполагая, что ваш сокет назван socket, используйте:
socket.disconnect()
Для тех, кто нашел это в гугле - прямо сейчас есть решение:
Socket.disconnect()
пинает клиента (на стороне сервера). У клиента нет шансов оставаться на связи :)
disconnect
событие сокета, чтобы узнать, отключился ли он. Тоже может быть close
событие, я не совсем уверен. См. Документацию socket.io для получения дополнительной информации об этом.
В моем случае я хотел разорвать базовое соединение, и в этом случае мне пришлось позвонить, socket.disconnect(true)
как вы можете видеть, это необходимо из источника здесь
Socket.io использует шаблон EventEmitter для отключения / подключения / проверки пульса, чтобы вы могли это сделать. Client.emit('disconnect');
У меня это не сработало :
`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');
// });
Вы можете socket = undefined
стереть, какой сокет вы подключили. Итак, когда вы хотите подключиться, сделайте сокет (url)
Так это будет выглядеть так
const socketClient = require('socket.io-client');
let socket;
// Connect to server
socket = socketClient(url)
// When want to disconnect
socket = undefined;
Добавьте новые соединения сокетов в массив, а затем, когда вы хотите закрыть все - пропустите их и отключите. (на стороне сервера)
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();
});