我是nodejs的新手并试图像许多人一样写聊天室。
聊天包括多个房间和客户。 /nick
/join
/help
/ls users
/ls rooms
之类的命令可以正常工作,尽管我遇到/kick
命令无法正常工作
我只是不确定你是如何通过id断开客户端的,到目前为止/kick client
能够呈现相应的客户端socket.id虽然我仍然坚持要通过socket.id启动代码。< / p>
到目前为止
代码:
断开发送/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);
};
答案 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);
}
答案 3 :(得分:0)
这是 Socket.IO v4 的另一个选项,不需要异步语法:
io.sockets.sockets.get(socket.id)
如果有误,有人可以纠正,但我认为每个套接字都有唯一的 ID,因此不需要迭代。