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