【问题标题】:socket.io get rooms which socket is currently insocket.io 获取当前套接字所在的房间
【发布时间】:2013-10-03 09:22:54
【问题描述】:

是否可以在不调用的情况下获取当前套接字所在的房间

io.sockets.clients(roomName)

每个房间名称并在结果中查找此套接字

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    在 socket.io 版本 1+ 中,语法是:

    socket.rooms
    

    【讨论】:

    • socket.rooms 在 1.3.6 中显示为空白...这仍然对您有用吗?
    • 返回undefined,版本:1.6.0。
    • 对我来说,它返回一个空白对象{},我使用的是2.3.0
    • 我也在使用 2.3.0,但它似乎对我有用?即使没有调用socket.join(),它也会返回一个等于套接字ID 的通道。也许您没有在连接函数中调用它?或者你的连接函数有socket以外的参数?
    【解决方案2】:

    交叉兼容方式

    var rooms = Object.keys(io.sockets.adapter.sids[socket.id]);
    // returns [socket.id, 'room-x'] or [socket.id, 'room-1', 'room-2', ..., 'room-x']
    

    【讨论】:

      【解决方案3】:

      来自Socket.IO Room doc

      io.sockets.manager.roomClients[socket.id]

      【讨论】:

        【解决方案4】:

        更新:Socket.io 3.0 发布


        3.x Socket.rooms 现在是Set,这意味着房间中的值只能出现一次

        结构示例:Set(4) {"<socket ID>", "room1", "room2", "room3"}

        io.on("connect", (socket) => {
          console.log(socket.rooms); // Set { <socket.id> }
          socket.join("room1");
          console.log(socket.rooms); // Set { <socket.id>, "room1" }
        });
        

        查看特定房间:

        socket.rooms.has("room1"); // true
        

        更多关于 Set 和可用方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

        迁移文档:https://socket.io/docs/migrating-from-2-x-to-3-0/

        【讨论】:

          【解决方案5】:

          当使用 非默认适配器 时,例如 socket.io-redis,socket.rooms 似乎无法解决问题。我设法在不循环的情况下为特定客户获取房间的方法是使用io.sockets.adapter.sids[socket.id],它将房间作为对象返回。

          { 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }
          

          请注意,这并没有列出其他进程上的套接字!

          socket.io v1.3.7,socket.io-redis 1.0.0

          【讨论】:

            【解决方案6】:

            版本 1.7.3,socket.rooms 包含 socket.id,所以删除它并获取房间列表:

            Object.keys(socket.rooms).filter(item => item!=socket.id);
            

            在其他版本中,您可以打印socket 并找到房间。

            【讨论】:

              【解决方案7】:

              Socket.io v2.1.1

              因此,请确保您没有像我一样访问 disconnect 事件中的套接字房间,因为在该事件触发时它们已经离开房间。如果您想这样做,请在 disconnecting 活动中尝试 - https://github.com/socketio/socket.io/pull/2332/files

              然后您可以使用以下任何一种:

              Object.keys(socket.adapter.rooms)
              Object.keys(socket.adapter.sids)
              Object.keys(socket.rooms)
              

              【讨论】:

              • 使用这种方法,有没有办法通过socket.id 字符串来查找套接字所在的房间?即不使用传递给事件的socket,而只是使用包含socket.id的字符串?
              【解决方案8】:

              2.0.3 版

              io.sockets.sockets[yourSocketID].rooms
              

              等于

              socket.rooms
              

              【讨论】:

                【解决方案9】:

                确保插座一次只能在一个房间中,我的解决方案是:

                var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
                

                【讨论】:

                  【解决方案10】:

                  socket.io 1.7.3 +

                  var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room
                  

                  【讨论】:

                  • Object.keys 没有排序,是吗?我认为这个解决方案一般都行不通。
                  • 老实说,我还没有在多个套接字上尝试过
                  • 在我们尝试显示房间时显示套接字 ID 本身
                  【解决方案11】:

                  当它加入一个房间时,你可以在套接字本身中保存空间

                  // join room
                  socket.join(room);
                  
                  // update socket's rooms
                  if (socket.rooms) {
                      socket.rooms.push(room);
                  } else {
                      socket.rooms = [room];
                  }
                  

                  稍后您可以简单地检索套接字所在的所有房间

                  socket.rooms
                  

                  来自服务器 API 文档:

                  socket.rooms (对象)
                  标识此客户所在房间的字符串哈希,按房间名称索引。

                  https://socket.io/docs/server-api/#socket-rooms

                  【讨论】:

                  • 只是想知道,socket.rooms 不会在每次套接字加入房间时由socket.io 自动更新吗?
                  • 绝不应该像这样修改 API。既然图书馆已经这样做了,为什么还需要更新 socket.rooms?
                  猜你喜欢
                  • 2020-03-17
                  • 2016-03-09
                  • 2015-08-05
                  • 2017-08-24
                  • 2021-07-02
                  • 1970-01-01
                  • 2018-04-06
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多