【问题标题】:how to get socket.io number of clients in room?如何获取房间中的socket.io客户端数量?
【发布时间】:2015-10-06 17:47:00
【问题描述】:

我的 socket.io 版本 1.3.5

我想获取特定房间的客户数量。

这是我的代码。

 socket.on('create or join', function (numClients, room) {
            socket.join(room);
    });

我使用此代码让客户进入房间:

console.log('Number of clients',io.sockets.clients(room));

【问题讨论】:

  • 请详细说明您需要什么帮助。
  • 我想获取特定房间的客户数量

标签: javascript node.js socket.io webrtc


【解决方案1】:

这适用于版本 3

io.sockets.adapter.rooms.get(roomName).size

【讨论】:

    【解决方案2】:

    要获取房间中的客户数量,您可以执行以下操作:

        function NumClientsInRoom(namespace, room) {
          var clients = io.nsps[namespace].adapter.rooms[room];
          return Object.keys(clients).length;
        }
    

    此变量 clients 将保存一个对象,其中每个客户端都是一个键。 然后,您只需获取该对象中的客户端(键)的数量。

    如果您尚未定义命名空间,则默认命名空间为“/”。

    【讨论】:

      【解决方案3】:

      有一个计数器变量来保持计数,当有人加入时增加,当有人断开时减少。

      io.on('connection', function (socket) {
      
      var numClients = {};
      
      socket.on('join', function (room) {
          socket.join(room);
          socket.room = room;
          if (numClients[room] == undefined) {
              numClients[room] = 1;
          } else {
              numClients[room]++;
          }
      });
      
      socket.on('disconnect', function () {
           numClients[socket.room]--;
      });
      

      【讨论】:

      • 房间名称是动态的,来自客户端。
      • 编辑为使用房间变量。
      • 我认为您的代码显示了 sock.io 中的客户总数
      • 您想统计每个动态房间吗?
      • 更新:现在,您可以通过numClients[socket.room]获取每个房间的客户数量。
      【解决方案4】:

      这对我有用。

      // check if your room isn't undefined.
      if (io.sockets.adapter.rooms['your room name']) 
      {
         // result
         console.log(io.sockets.adapter.rooms['your room name'].length);
      }
      

      【讨论】:

        【解决方案5】:

        这对我有用

        io.in('yourRoom').allSockets().then(result=>{
            console.log(res.size) })
        

        【讨论】:

          【解决方案6】:

          在 socket.io ^1.4.6

          function numClientsInRoom(namespace, room) {
              var clients = io.nsps[namespace].adapter.rooms[room].sockets;
              return Object.keys(clients).length;
          }
          

          您需要将.sockets 添加到rooms[room],因为变量客户端将所有连接保存在sockets 变量中。

          【讨论】:

            【解决方案7】:

            我参加聚会有点晚了,但我找到了一个有效的解决方案:

            io.in('YOUR_ROOM').engine.clientsCount;

            【讨论】:

              【解决方案8】:

              socket.io 的rooms 是一个Map,其元素映射到Sets。

              您使用get(roomId) 来获取MaproomId 的值,并且您使用.size 来获取集合中的元素数量,而.length 用于获取数组中的元素数量。

              socket.on("join-room",roomId => {
                  const room = io.of("/yourNameSpace").adapter.rooms.get(roomId)
                   if(room === undefined || room.size < 2) {
                     socket.join(roomId)
                   }else {
                     io.of("/yourNameSpace").emit("can't join link")
                   }
                })

              【讨论】:

                【解决方案9】:
                io.nsps['/'].adapter.rooms['your room name'].sockets;
                

                如果您的命名空间不是/,请更改它。

                【讨论】:

                • 这对我有用。 var count = io._nsps.get('/').adapter.rooms.get(roomName).size;
                猜你喜欢
                • 2021-03-08
                • 2018-04-06
                • 1970-01-01
                • 2019-03-25
                • 2015-01-05
                • 2014-07-14
                • 1970-01-01
                • 2015-08-17
                相关资源
                最近更新 更多