Socket.io通过id断开客户端

时间:2014-06-28 04:01:42

标签: node.js socket.io disconnect

我是nodejs的新手并试图像许多人一样写聊天室。 聊天包括多个房间和客户。 /nick /join /help /ls users /ls rooms之类的命令可以正常工作,尽管我遇到/kick命令无法正常工作

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

代码:

断开发送/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.'});
    }
  });
}

客户方:

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

4 个答案:

答案 0 :(得分:10)

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

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

<强>更新

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

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

答案 1 :(得分:3)

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

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);
});

答案 2 :(得分:1)

Socket.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);
}

Reference link

答案 3 :(得分:0)

这是 Socket.IO v4 的另一个选项,不需要异步语法:

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

如果有误,有人可以纠正,但我认为每个套接字都有唯一的 ID,因此不需要迭代。