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

时间:2016-08-12 12:59:21

标签: javascript node.js 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);
    });

2 个答案:

答案 0 :(得分:3)

服务器端,您可以获得套接字所在的房间列表:

socket.rooms

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

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

答案 1 :(得分:1)

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

通过上面的代码,您可以识别套接字已连接的所有房间。 您可以跳过索引0中的第一个房间,因为它是套接字在连接时将连接的默认房间。

使用SocketIO 1.7进行测试并运行良好。

相关问题