NodeJS Socket.io按id断开客户端

qyswt5oh  于 11个月前  发布在  Node.js
关注(0)|答案(6)|浏览(123)

我是nodejs的新手,想像很多人一样写一个聊天室。聊天室由多个房间和客户端组成。像/nick/join/help/ls users/ls rooms这样的命令可以像你期望的那样工作,尽管我在让/kick命令工作时遇到了麻烦。
我只是不确定如何通过id断开客户端连接,到目前为止,/kick client能够提供相应的客户端socket.id,尽管我被通过socket. id踢的代码卡住了。
到目前为止的代码:
断开发送/kick的客户端:socket.disconnect();

从arg /kick clientdelete io.sockets.sockets[client];中删除客户端

删除客户端并不会断开它们,它们仍然可以接收数据,只是不发送数据。

已解决

好奇的家伙的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);
};

fkaflof6

fkaflof61#

下面的代码适用于Socket.IO1.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();
}

mnemlml8

mnemlml82#

这是一个老问题,但如果有人想知道更新的版本;
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);
});

字符串

ycggw6v2

ycggw6v23#

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

mzsu5hc0

mzsu5hc04#

下面是Socket.IO v4的另一个选项,它不需要使用Java语法:

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

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

tsm1rwdh

tsm1rwdh5#

伺服器:

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并将名称存储在对象“Users”中,并为其提供ID值“users.name =用户的socket.ID”,然后当您在客户端的控制台中写入“socket.emit”时,(“kick”,用户的用户名)'它断开了用户与套接字的连接,这样他们就不能再聊天了,直到他们重新加载,所以它几乎把他们踢出了聊天。

dced5bon

dced5bon6#

const usersocket = io.sockets.sockets.get("socketid");
userSocket?.disconnect();
//emit socket event....

字符串

相关问题