2013-09-27 34 views

回答

8

从在Socket.IO Room doc

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

+0

感谢,错过了意外 – Herokiller

+5

这是正确的1+? –

+4

'manager'在1.3.6中返回undefined ... – Crashalot

23

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

socket.rooms 
+3

'socket.rooms'在1.3.6中显示为空......这是否仍适用于您? – Crashalot

+1

返回'undefined',版本:1.6.0。 –

+0

在版本中工作:1.7.3 !!! – user3655266

2

当使用非默认适配器,如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

-1

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

3

socket.io 1.7.3+- >

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

socket.io 1.7.3 +

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

'Object.keys'没有排序,是吗?我认为这个解决方案通常不起作用。 – stholzm

+1

说实话我还没有尝试过它在多个插座 – filemono

+0

,当我们试图展示房间时,它显示套接字ID本身 – Adry

1

版本1.7.3,socket.rooms包含socket.id,因此将其删除,并得到房间的列表:

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

在其他版本中,你可以打印socket,并找到房间。

0

版本2.0.3

io.sockets.sockets[yourSocketID].rooms 

socket.rooms 
0

等于您可以保存在插座本身的房间时,它加入了一个房间

// join room 
socket.join(room); 

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

以后可以检索所有客房该插座是由简单的

socket.rooms 
0

作为确保插座是在只有一个房间的时间,我的解决办法是:

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