繁体   English   中英

跟踪已连接的 sockets 和 socket.io

[英]Keep track of connected sockets with socket.io

如何跟踪socket.io中所有已连接的客户端?

我在服务器上试过这个:

let numSockets = 0;

io.on('connection', (socket) => {
  io.sockets.emit('numSockets', ++numSockets);

  socket.on('disconnect', () => {
    io.sockets.emit('numSockets', --numSockets);
  });
});

这在客户端:

const socket = io();

socket.on('numSockets', function (numSockets) {
  console.log(numSockets);
});

它确实打印了一个数字,但是这个数字,但是,如果我打开 2 windows,它显示 4 connected sockets。

这是正确的方法吗?

我想要实现的是在我网站的侧边栏中打印已连接套接字的 ID 列表,并让用户根据需要设置用户名(而不是自动生成的 ID)。

但在继续之前,我将确保我可以以正确的方式跟踪 sockets。

Namespace#connected对象包含连接到特定命名空间的所有套接字(由它们的 id 键控)。

要检索默认命名空间 ( / ) 的套接字 ID:

let clientIds = Object.keys( io.of('/').connected );

(其中io是服务器实例)

我不认为io.sockets.emit(io.of('/').connected)是一个好主意,因为它会发送一个包含大量数据的套接字对象的哈希值:-)

您可以尝试以下功能:

function findUsersConnected(room, namespace) {
  var names = [];
  var ns = io.of(namespace || "/");    

  if (ns) {
    for (var id in ns.connected) {
      if(room) {
        var roomKeys = Object.keys(ns.connected[id].rooms);
        for(var i in roomKeys) {
          if(roomKeys[i] == room) {
            if (ns.connected[id].username) {
              names.push(ns.connected[id].username);
            } else {
              names.push(ns.connected[id].id);
            }  
          }
        }
      } else {
        if (ns.connected[id].username) {
          names.push(ns.connected[id].username);
        } else {
          names.push(ns.connected[id].id);
        }  
      }
    }
  }
  return names.sort();
}

它返回连接到命名空间中房间的用户数组。 如果套接字没有socket.username属性,则使用socket.id代替。

例如:

var usersConnected = findUsersConnected();
var usersConnected = findUsersConnected('myRoom');
var usersConnected = findUsersConnected('myRoom', '/myNamespace');

我相信它是Object.keys(io.sockets.connected).length 检查服务器api http://socket.io/docs/server-api/

截至今天,socket.io 在服务器端实现了一个名为 fetchSockets() 的函数来检索当前在服务器端连接的所有套接字。 (来源: https : //socket.io/docs/v4/server-instance/#fetchSockets

然后你可以像这样使用它:

const io = require("socket.io")

async function retrieveSockets() {
    const connectedSockets = await io.fetchSockets()
}

就我测试而言,您甚至可以在套接字上执行操作,例如发出事件,加入房间......等

const count = io.engine.clientsCount;

这似乎是一种更具包容性的方法,并且可能与主命名空间中的 Socket 实例数量相同,如下所示。 但是根据名称空间和用法,它们可能会有所不同。

const count2 = io.of("/").sockets.size;

https://socket.io/docs/v4/server-api/#engineclientscount

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM