在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,效果很好。