如何在最新版本(v1.3.7)中获取socket.io中的房间列表?
io.nsps['/namespace'].adapter.rooms
会返回这样的内容:
{
mIfp3VIpt103xS3RAAAD: { mIfp3VIpt103xS3RAAAD: true },
'9XaViM2Q-A1NGziRAAAE': { '9XaViM2Q-A1NGziRAAAE': true },
science: { '9XaViM2Q-A1NGziRAAAE': true },
'2FopECkAq5Z4AIHMAAAF': { '2FopECkAq5Z4AIHMAAAF': true },
math: { '2FopECkAq5Z4AIHMAAAF': true },
s3JRFhNUz1Tz9apeAAAH: { s3JRFhNUz1Tz9apeAAAH: true }
}
显然,那里的唯一房间是science
和math
我怀疑其他人都是socket id。
我怎样才能将science
和math
作为房间清单?
答案 0 :(得分:1)
Socket.io将为每个连接的套接字保留一个打开的空间,以便向单个套接字发送消息:
socket.broadcast.to(id).emit('my message', msg)
您可以保留已连接套接字ID列表:
var cached = []
io.on('connection', function(socket) {
if(cached.indexOf(socket.id) === -1)
cached.push(socket.id)
})
不要忘记在断开连接时删除它们
然后,减少房间列表:
var rooms = io.nsps['/namespace'].adapter.rooms
var realRooms = {}
for(var i in rooms) {
if(~cached.indexOf(i)) {
realRooms[i] = rooms[i]
}
}
可能有其他方法可以做到这一点,但这是我想到的第一个。
答案 1 :(得分:1)
由于io.nsps['/chatSystem'].adapter.sids
将返回连接套接字的集合,这就是我解决问题的方法
var realRooms = [];
var rooms = io.nsps['/chatSystem'].adapter.rooms;
var sids = io.nsps['/chatSystem'].adapter.sids;
for ( var room in rooms ) {
if ( !( room in sids ) ) {
realRooms.push( room );
}
}
答案 2 :(得分:0)
您可以使用以下内容获取ROOMS列表(与每个套接字/连接的ID不同):
for(R in io.nsps)console.log(R);
服务器/机器中每个ROOM的返回列表。
(nsps是每个命名空间的“内部名称”)