2017-08-02 123 views
1

你怎么能使用socket.io 2.0socket.io 2.0获取连接的客户端在一个房间里


我已经尝试过类似的问题的解决检索所有连接的客户端在一个房间:https://stackoverflow.com/a/45160538/2189845

var sockets = io.in("room_name") 
Object.keys(sockets.sockets).forEach((item) => { 
console.log("TODO: Item:", sockets.sockets[item].id)    
}) 

但是,无论房间如何,这都会在所有套接字连接上循环。所以,上面的代码给出了相同的结果:

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

回答

0

不幸的是,这个答案并不完全满足有机磷农药的问题。如果您正在使用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' 
}); 

这是来自:https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

+1

这个工程,所以我接受这是正确的答案。当你只运行一个节点服务器时,感觉就像是过度杀毒。你需要运行一个额外的redis服务器,仅用于拥有连接客户端的列表。希望有一个更简单的解决方案,但我会去为这一个。它让我们准备升级到多个节点服务器我猜。 –

+0

如何使用套接字ID跟踪用户信息?可以使用redis键值对,但如果服务器重新启动并且客户端重新连接,则会创建一个新的套接字标识,并且旧套接字标识将保留在redis中,导致内存泄漏。 – Koder

0

尝试:

io.sockets.clients('room_name').forEach(function(item) { 
    console.log(item.id);//any property of socket you want to print 
}); 

或者你可以尝试:

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

这些都是无效2.0下去了。对于第一个解决方案,我收到'TypeError:fn.bind不是函数','TypeError:无法读取未定义的属性'套接字''。 –

相关问题