Socket.io 通过 id 断开客户端连接

问题描述 投票:0回答:6

我是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.'});
    }
  });
}

客户端:

kickClient = function(client) {
  this.socket.emit('kick', client);
};
node.js socket.io disconnect
6个回答
17
投票

以下代码适用于 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();
}

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

4
投票

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
投票

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

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

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


0
投票

服务器:

var users = {};
socket.on("identify", (username, id) => {
  eval("users." + username + " = " + '"' + socket.id + '"')
});
socket.on("getId", (username) => {
  console.log(eval("users." + username))
});
socket.on("kick", (username) => {
  io.sockets.sockets.forEach((socket) => {
    if(socket.id === eval("users." + username))
        socket.disconnect(true);
});
})

客户:

const username = prompt("What Is Your Name?")
socket.emit("identify", username)

说明: 当客户端进入网页时,他们会被问到他们的名字是什么,然后它将名称发送到服务器,然后服务器获取客户端的 id 并将该名称存储在对象“用户”中,并为其提供 id 值。 users.name = 用户的 socket.ID' 然后当您在客户端的控制台中写入 'socket.emit("kick", 用户的用户名)' 时,它会断开该用户与套接字的连接,以便他们无法再聊天直到他们重新加载,所以这几乎将他们从聊天中踢了出来。


0
投票
const usersocket = io.sockets.sockets.get("socketid");
userSocket?.disconnect();
//emit socket event....
© www.soinside.com 2019 - 2024. All rights reserved.