Socket.io通过id断开客户端

rwx*_*xes 5 disconnect node.js socket.io

我是nodejs的新手,并试图像许多人一样写聊天室.聊天包括多个房间和客户./nick /join /help /ls users /ls rooms尽管我在获取/kick命令工作时遇到了麻烦,但是像你期望的那样工作的命令.

我只是不确定你如何通过id断开客户端,到目前为止/kick client能够呈现相应的客户端socket.id虽然我仍然坚持通过socket.id踢代码.

代码到目前为止:

断开发送的客户端/kick:socket.disconnect();

从arg中删除客户端/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.'});
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

客户端:

kickClient = function(client) {
  this.socket.emit('kick', client);
};
Run Code Online (Sandbox Code Playgroud)

Ole*_*leg 10

以下代码适用于Socket.IO 1.0,但我不确定这是最佳解决方案:

if (io.sockets.connected[socket.id]) {
    io.sockets.connected[socket.id].disconnect();
}
Run Code Online (Sandbox Code Playgroud)

更新:

使用Socket.IO 0.9,代码会略有不同:

if (io.sockets.sockets[socket.id]) {
    io.sockets.sockets[socket.id].disconnect();
}
Run Code Online (Sandbox Code Playgroud)


Clo*_*ery 5

这是一个老问题,但如果有人想知道新版本;

Socket.IO v4.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);
});
Run Code Online (Sandbox Code Playgroud)