Чи є спосіб відключити клієнта з 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.disconnect()
Для тих, хто знайшов це в google - зараз є рішення для цього:
Socket.disconnect()натискає на клієнта (на стороні сервера). Немає шансів для клієнта залишатися на зв'язку :)
disconnectподію сокету, щоб з’ясувати, чи не відключився він. Може також бути closeподією, я не зовсім впевнений. Для отримання додаткової інформації про це див. Документацію на socket.io.
Перевірившись сьогодні вранці, видається, що зараз:
socket.close()
У моєму випадку я хотів зірвати базове з'єднання, і в такому випадку мені довелося зателефонувати, 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стерти, який сокет ви підключили. Тож коли потрібно підключити do socket (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();
});