socket.io:套接字只有一个房间

时间:2016-04-14 22:55:51

标签: node.js sockets websocket socket.io

我想保证用户一次只能进入一个房间,但我很难实现这一点。我把问题归结为无法获得套接字当前所有房间的列表。

我目前的策略是做这样的事情:

io.on('connection', function(socket) {
    console.log('A user just connected with id ' + socket.id);
    socket.on("change room", function(data) {
        // this SHOULD return a list of all rooms this user is in
        var socketsRooms = socket.rooms;
        console.log(socket.rooms) //{ '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }
        console.log(typeof socket.rooms) // object
        // Loop through the rooms and leave them
        for (var room in socketsRooms) {
            console.log('LEAVING ROOM: ', room);
            socket.leave(room);
        }

        // Join the new room
        socket.join(data.newroom);
    });
    socket.on('disconnect', function() {
        console.log('user ' + socket.id + ' disconnected');
    });
})

socket.rooms的文档中是否存在问题?它说应该返回一个套接字所连接的房间数组,但我将数据作为id对象返回。 EX: { '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }

...在我的情况下,我会期待类似['issues']

的内容

在Socket.io github page上,socket.rooms说明:

  

标识此套接字所在房间的字符串哈希,索引为   房间名称。

在标记为重复之前:

我已经查看了以下问题:

  1. How to leave all rooms that the socket is connected to at one go in Node.js
  2. socket.io: assure socket joins only one room at a time
  3. 第一个问题的答案似乎是最常被攻击的解决方案,我很确定它会起作用,因为它假设解决方案是维护我们自己的列表,但我更喜欢使用socket.io而不是该方法的工作解决方案。 / p>

    我在客户端使用带有angular2 beta的socket.io v1.4.5的最新版本(如果这样做有帮助的话)

1 个答案:

答案 0 :(得分:1)

在socket.io中,每个套接字也连接到自己的房间。这个房间的名称与socket.id相同。因此,离开房间时,请确保不要离开自己的房间。

for(room in socket.rooms){
    if(socket.id !== room) socket.leave(room);
}
socket.join(data.newroom, function(){
  console.log('rooms', socket.rooms); // here you'll see two rooms: one with socket.id and another with data.newroom
});