在socket.io中获取套接字的空间

如何检索套接字是的成员? 我正在使用socket.io版本1.4

我尝试了this.socket.adapter.rooms但我在Chrome控制台收到这个错误: Cannot read property 'rooms' of undefined

在我的客户端代码中,我有这个方法:

 send(msg) { if(msg != ''){ var clientInfo = []; clientInfo.push(msg); clientInfo.push(socket.id); clientInfo.push(this.socket.adapter.rooms); socket.emit('message', clientInfo); } } 

在我的服务器端:

 socket.on('message', function(clientInfo){ var clientmessage = clientInfo[0]; var clientid = clientInfo[1]; var clientroom = clientInfo[2]; io.to(clientroom).emit('messageSent', clientmessage); }); 

服务器端,你可以得到一个套接字的房间列表:

 socket.rooms 

客户端,一个套接字不知道它在哪个房间。房间的整个概念是一个服务器端的概念,所有的数据结构都维护在那里。 如果一个客户想知道它在哪个房间,它要么必须跟踪它要求的那个房间,要么询问服务器它在哪个房间。

服务器端socket.rooms结构有一个奇怪的socket.rooms 。 显然不是实时更新的。 如果您使用socket.join("someRoom") ,然后立即查看socket.rooms ,则不会看到列出的someRoom名称。 但是,如果您查看process.nextTick()setTimeout() ,您将在socket.rooms看到它。 我还没有深入研究socket.io源代码来弄清楚为什么它是这样,但显然有些东西只是asynchronous更新。

  Object.keys(socket.rooms).forEach(function(room, idx) { if(idx!=0){ console.log(idx,"-->",room) } }); 

通过上面的代码,你可以确定套接字已经join的所有房间。 您可以跳过索引0中的第一个房间,因为这是套接字连接时将默认的空间。

使用SocketIO 1.7进行testing,效果很好。