如何在socket.io的Node.js服务器上列出房间

42
在探讨如何创建Socket.IO多播组的进程中,我发现创建房间是实现所需功能的好方法。
然而,若能无需额外数据结构即可了解所有房间信息会更好。
是否可以通过服务器套接字从服务器获取所有房间的列表?

抱歉完全错过了这个答案,但希望我下面的回答能帮到你。 - Alfred
17个回答

1
在Socketio 2.0中,获取房间的方法为:

to get rooms use

Object.keys(socket.adapter.rooms);

获取房间名称。
Object.keys(socket.adapter.rooms)[1];

1
过滤出“真实”房间可以这样做:
var realRooms = Object.keys(io.sockets.adapter.rooms).reduce((filtered, key) => {
    if(!io.sockets.adapter.rooms[key].sockets.hasOwnProperty(key)) filtered.push(key);
    return filtered;
}, []);

0

我没有足够的声望来发布我的评论到原始问题,但是另外,如果你想列出命名空间中的所有房间,应该这样编码:

var nsp = io.of('/my-nsp');

var rooms = nsp.adapter.rooms;

这将有助于客户端加入房间:

socket.join('my-room');

当你执行 console.log(rooms); 时,你应该能够看到你的房间名。

我只是想回答上面一个未回答的评论,因为我遇到了同样的问题,之后发现有不匹配的房间名。


对于我来说:io.socket.of('').adapter.rooms[room] - pery mimon

0

对于套接字 v4。这个可以工作:

io.sockets.adapter.rooms.get("id of the room")

0
function ActiveRooms(){
        var activeRooms = [];
        Object.keys(io.sockets.adapter.rooms).forEach(room=>{
            var isRoom = true;
            Object.keys(io.sockets.adapter.sids).forEach(id=>{
                isRoom = (id === room)? false: isRoom;
            });
            if(isRoom)activeRooms.push(room);
        });
        return activeRooms;}

我知道这是一个旧帖子,但这就是我所做的。我注意到每个插座的房间中都有ID。 - Jay Stratemeyer

0
要获取一个包含v4中所有房间的字符串数组,您可以使用以下方法:
// if you are not using namespaces
Array.from(io.of("/").adapter.rooms.keys());
// if you are using namespaces
Array.from(io.of("/your-namespace").adapter.rooms.keys());
// output: ["room1", "room2", ...]

-1
你这样做:
await io.in(roomID).fetchSockets()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接