socket.io获取当前sockets的空间

是否有可能得到哪些套接字当前在哪里,而不用打电话

io.sockets.clients(roomName) 

为每个房间的名字,并在结果中寻找这个sockets

从Socket.IO房间doc :

io.sockets.manager.roomClients[socket.id]

在socket.io版本1+中,语法是:

 socket.rooms 

当使用非默认适配器 (如socket.io-redis)时, socket.rooms似乎无法实现。 我设法得到一个特定的客户端没有循环的方式是使用io.sockets.adapter.sids[socket.id] ,它作为一个对象返回房间。

 { 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true } 

请注意,这不会列出其他进程上的套接字,但!

socket.io v1.3.7,socket.io-redis 1.0.0

socket.io 1.7.3+ – >

 Object.keys( io.sockets.adapter.sids[socket.id] ) // returns [socket.id, room-x'] || [socket.id, 'room-1', 'room-2', ...] 

版本1.7.3, socket.rooms包含socket.id ,所以删除它,并获得房间列表:

 Object.keys(socket.rooms).filter(item => item!=socket.id); 

在其他版本中,您可以打印socket并find房间。

socket.io 1.7.3 +

 var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room 

版本2.0.3

 io.sockets.sockets[yourSocketID].rooms 

等于

 socket.rooms 

join房间时,可以节省空间

 // join room socket.join(room); // update socket's rooms if (socket.rooms) { socket.rooms.push(room); } else { socket.rooms = [room]; } 

稍后,您可以简单地检索套接字所在的所有房间

 socket.rooms 

确保套接字一次只能在一个房间里,我的解决scheme是:

 var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id); 

1.4.5版本=> io.sockets.adapter.rooms[roomname].sockets