Сокет.io отключить клиента по идентификатору

#node.js #socket.io #disconnect

#node.js #socket.io #отключить

Вопрос:

Я новичок в nodejs и пытаюсь создать чат, как это делают многие люди. Чат состоит из нескольких комнат и клиентов. Такие команды /nick /join /help /ls users /ls rooms работают так, как вы ожидаете, хотя у меня возникают проблемы с получением /kick команды для работы.

Я просто не уверен, как вы отключаете клиента по идентификатору, пока /kick client что он может представить соответствующий клиентский сокет.идентификатор, хотя я застрял, чтобы код запускался через socket.id .

Код пока:

Отключить клиента, отправившего /kick : socket.disconnect();

Удалить клиент из аргумента /kick client : delete io.sockets.sockets[client];

Удаление клиента не отключает их, хотя они все равно могут получать данные, но не отправлять их.

Решаемая

CuriousGuy 0.9 работал безупречно, для тех, кому интересно — вот код, который я использую.

На стороне сервера:

 handleClientKick(socket);

...

function handleClientKick(socket) {
  socket.on('kick', function(client) {
    if (typeof io.sockets.sockets[client] != 'undefined') {
      socket.emit('message', {text: nickNames[socket.id]   ' kicked: '   nickNames[client]});
      io.sockets.sockets[client].disconnect();
    } else {
      socket.emit('message', {text: 'User: '   name   ' does not exist.'});
    }
  });
}
  

На стороне клиента:

 kickClient = function(client) {
  this.socket.emit('kick', client);
};
  

Ответ №1:

Следующий код работает с сокетом.Ввод-вывод 1.0, однако я не уверен, что это лучшее решение:

 if (io.sockets.connected[socket.id]) {
    io.sockets.connected[socket.id].disconnect();
}
  

Обновить:

С помощью сокета.IO 0.9 код будет немного отличаться:

 if (io.sockets.sockets[socket.id]) {
    io.sockets.sockets[socket.id].disconnect();
}
  

Комментарии:

1. хм, я получаю неопределенный, когда запускаю console.log(io.sockets.connected[socket.id]) какую-нибудь идею?

2. Это означает, что либо этот сокет уже отключен, либо socket.id значение недопустимо. Что вы получите, если запустите console.log(socket.id); ?

3. Я протестировал свое решение с помощью сокета. IO 1.0

4. socket.id работает, как ожидалось, возвращая BGGkTQOOBJTcO2YukQLl и т. Д. — Только что проверил, и я использую 0.9.16, я попробую с 1.0

5. столкнувшись со всевозможными другими ошибками, пытаясь выполнить мой код до версии 1.0, работающий на версии 1.0 (вроде как ожидал этого). Мне кажется странным, насколько сложно мне отключить клиента от клиентов socket.id , но в целом так просто настроить sockets.io .

Ответ №2:

Это старый вопрос, но если кто-нибудь интересуется более новыми версиями;

В сокете.Ввод-вывод версии 4.X io.sockets.connected[socket.id] или io.sockets.sockets[socket.id] не работает.

Итак, нам нужно сделать так;

 io.sockets.sockets.forEach((socket) => {
    // If given socket id is exist in list of all sockets, kill it
    if(socket.id === givenSocketID)
        socket.disconnect(true);
});
  

Ответ №3:

Альтернативное решение в сокете.IO v4.X

Для всех сокетов

 const sockets = await io.fetchSockets();
  

Для конкретного сокета

 const sockets = await io.in(theSocketId).fetchSockets();
  

Повторять сокеты

 for (const socket of sockets) {
     console.log("socket id",socket.id);
     socket.disconnect(true);
}
  

Ссылка для ссылки

Комментарии:

1. io.in(theSocketId).fetchSockets Когда-нибудь вернет несколько сокетов?

2. Нет, он вернет только один, цикл можно удалить

Ответ №4:

Вот еще один вариант для сокета.Ввод-вывод версии 4, не требующий асинхронного синтаксиса:

 io.sockets.sockets.get(socket.id)
  

Кто-нибудь может исправить это, если это неправильно, но я думаю, что каждый сокет имеет уникальный идентификатор, поэтому не должно быть необходимости в повторении.

Комментарии:

1. у меня это не сработало, оно возвращает undefined

2. Красиво и чисто. Работал отлично