如何获得房间列表

时间:2015-04-27 10:20:35

标签: node.js socket.io

如何在最新版本(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 } 
}

显然,那里的唯一房间是sciencemath 我怀疑其他人都是socket id。

我怎样才能将sciencemath作为房间清单?

3 个答案:

答案 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是每个命名空间的“内部名称”)