socket.io 2.0在房间中连接客户端

socket.io 2.0在房间中连接客户端,socket.io,Socket.io,如何使用socket.io 2.0检索房间中所有已连接的客户端 我已经尝试过类似问题的解决方案: 但这会在所有插座连接上循环,而不考虑房间。因此,上面的代码给出了与以下相同的结果: Object.keys(io.sockets.sockets).forEach((item) => { console.log("general socket: Item:", item); }); 尝试: 或者你可以试试: var clients = io.sockets.adapter.room

如何使用socket.io 2.0检索房间中所有已连接的客户端


我已经尝试过类似问题的解决方案:

但这会在所有插座连接上循环,而不考虑房间。因此,上面的代码给出了与以下相同的结果:

Object.keys(io.sockets.sockets).forEach((item) => {
    console.log("general socket: Item:", item);
});
尝试:

或者你可以试试:

var clients = io.sockets.adapter.rooms['room_name'].sockets;
for (var clientId in clients ) {

     //this is the socket of each client in the room.
     var SocketofClient = io.sockets.connected[clientId];
     console.log(SocketofClient.id);
}

不幸的是,这个答案并不能完全满足这个问题。如果您使用
socket.io redis
来管理套接字连接,您可以像

io.of('/').adapter.clients((err, clients) => {
  console.log(clients); // an array containing all connected socket ids
});

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});

// you can also use

io.in('room3').clients((err, clients) => {
  console.log(clients); // an array containing socket ids in 'room3'
});

这来自:

检查在socket.io 2.0中运行的代码

  io.sockets.in(roomID).clients(function(err, clients) {
                            clients.forEach(client => {
                                let user = io.sockets.connected[client];
                                console.log("Connected Client ", user.displayName);
                            });
                        });

这些在2.0中不再有效。我收到第一个解决方案的“TypeError:fn.bind不是函数”,第二个解决方案的“TypeError:cannotreadproperty'sockets'ofundefined”。这是有效的,因此我接受了这一正确答案。当您只运行一个节点服务器时,感觉像是过度杀戮。。您只需要运行一个额外的redis服务器,就可以拥有一个连接的客户端列表。希望有一个更简单的解决方案,但我会选择这个。我想这会让我们准备好升级到多节点服务器。如何使用套接字id跟踪用户信息?可以使用redis密钥-值对,但如果服务器重新启动且客户端重新连接,则会创建一个新的套接字id,而旧的套接字id仍保留在redis中,从而导致内存泄漏。
io.of('/').adapter.clients((err, clients) => {
  console.log(clients); // an array containing all connected socket ids
});

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});

// you can also use

io.in('room3').clients((err, clients) => {
  console.log(clients); // an array containing socket ids in 'room3'
});
  io.sockets.in(roomID).clients(function(err, clients) {
                            clients.forEach(client => {
                                let user = io.sockets.connected[client];
                                console.log("Connected Client ", user.displayName);
                            });
                        });