使用套接字io的已连接客户端用户名列表

时间:2012-01-09 13:00:06

标签: node.js express socket.io

我在NodeJS,socketIO和Express中创建了一个具有不同聊天室的聊天客户端。 我试图在每个房间的连接用户上显示更新列表。

有没有办法将用户名连接到对象,这样我就可以看到所有用户名:

var users = io.sockets.clients('room')

然后做这样的事情:

users[0].username

我还能以其他方式做到这一点?

解决: 这有点重复,但解决方案并没有在任何地方写得非常清楚,所以我想我在这里写下来。这是由post回答的Andy Hin mak解决方案。以及这篇文章中的评论。

只是为了让事情更清楚一些。如果要在套接字对象上存储任何内容,可以执行以下操作:

socket.set('nickname', 'Guest');    

套接字也有一个get方法,所以如果你想让所有用户都这样做:

for (var socketId in io.sockets.sockets) {
    io.sockets.sockets[socketId].get('nickname', function(err, nickname) {
        console.log(nickname);
    });
}

正如alessioalex指出的那样,API可能会发生变化,自行跟踪用户会更安全。您可以通过断开连接时使用套接字ID来实现此目的。

io.sockets.on('connection', function (socket) { 
    socket.on('disconnect', function() { 
        console.log(socket.id + ' disconnected');
        //remove user from db
    }
});

2 个答案:

答案 0 :(得分:41)

有类似的问题可以帮助您:

Socket.IO - how do I get a list of connected sockets/clients?

Create a list of Connected Clients using socket.io

我的建议是跟踪自己的连接客户端列表,因为您永远不知道Socket.IO的内部API何时可能会发生变化。因此,在每个连接上将客户端添加到数组(或数据库),并在每个连接上删除他。

答案 1 :(得分:0)

在socket.io@2.3.0中,您可以使用:

Object.keys(io.sockets).forEach((socketId) => {
  const socket = io.sockets[socketId];
})