我现在正在使用带有多个节点的socket.io,因此我开始使用socket.io-redis适配器(https://github.com/socketio/socket.io-redis)来帮助我在节点之间进行同步。
我想获得服务器上所有房间的列表以及每个房间中相应数量的客户端。
在任何时候我都可能有数以千计的房间,并且想要快速计算每个房间的数量。
要获得我要做的所有房间的清单:
io.of('/').adapter.allRooms((err, rooms) => {
console.log(rooms); // an array containing all rooms (accross every node)
});
这将返回所有房间的列表,但此时我不确定每个用户有多少个连接。
然后我可以运行下一个查询来单独获取每个房间的计数:
//query the first room, second room and so on...
io.in('firstroom').clients((err, clients) => {
console.log(clients); // an array containing socket ids in 'room3'. Aggregate them to get the count
});
这看起来非常低效,因为我将进行如此多的调用以单独计算。有没有比这更有效的方法来获得所有房间的列表以及相关的连接数?我已经考虑修改适配器代码,但我并不真正理解代码所做的任何更改。
答案 0 :(得分:0)
您找到了解决方案吗?
似乎io.sockets.adapter.rooms将房间连同所连接的客户端数量一起返回。但是不确定它是否适用于redis-adapter环境。
例如2人连接到'someroom',io.sockets.adapter.rooms返回以下内容
{someroom:Room { 套接字:{'dypabpHYTZii0F-bAAAC':true,GtGoSvP5yCOrQoMMAAAD:true}, 长度:2},'dypabpHYTZii0F-bAAAC':房间{套接字:{'dypabpHYTZii0F-bAAAC':真},长度:1},GtGoSvP5yCOrQoMMAAAD: 会议室{套接字:{GtGoSvP5yCOrQoMMAAAD:true},长度:1}}