Socket.io连接用户计数

imp*_*335 44 websocket node.js socket.io

我终于让socket.io正常工作,但我遇到了一个奇怪的问题.

我不确定这是不是最好的方法,但我使用的是:

io.sockets.clients().length
Run Code Online (Sandbox Code Playgroud)

这将返回连接到我的服务器的客户端数量.问题是在用户连接和断开连接后,数量开始保持高于应有的水平.

例如,如果我连接并询问我的朋友,数字会上升,这是正确的.但是当我们开始断开连接并重新连接时,数量不会减少.

我在vmware ubuntu服务器上运行node.js和sockets.io服务器.

有谁知道为什么这是或有更好的方法来找出有多少人连接到服务器?

Mod*_*ody 59

以防有人在使用socket.io版本1.0时访问此页面

您可以从中获取连接的客户端数量

socketIO.engine.clientsCount
Run Code Online (Sandbox Code Playgroud)

需要一个答案,上面的内容不适用于socket.io的新版本

  • 这个正在最新的Socket IO(v2)中工作 (3认同)

dri*_*hev 40

这有一个github问题.问题是每当有人断开连接时socket.io不会从数组中删除(拼接),而只是将值设置为"null",所以实际上你的数组中有很多空值,这会使你的客户端( ).length大于你现实中的连接.

您必须管理一种不同的方式来计算您的客户,例如

socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });
Run Code Online (Sandbox Code Playgroud)

这是一个嗡嗡声,为什么socket.io背后的人留下了类似的东西,但更好的解释在github问题,我发布作为链接!

  • 好吧看起来有点困难,因为github上有很多关于这个的评论,socket.clients()在脚本的其他地方使用,所以如果他们用splice删除客户端,它可能会损坏socket.io的其他部分 (3认同)
  • 在最新的socket.io@^2.0.3 版本中使用这种方法,其他方法不起作用。 (2认同)
  • 我做到了,我得到了-600。> __> (2认同)

Lor*_*ran 28

我已经找到了在版本1.3.7中找到它的方法.有三种方法如下:

  1. io.engine.clientsCount
  2. io.sockets.sockets.length
  3. Object.keys(io.sockets.connected).length

希望这些可以帮助有同样问题的人.:)

  • 第二种方法不再适用于socket.io 1.4.5.我能找到的唯一类似的替代方案是`Object.keys(io.sockets.sockets).length`. (8认同)

raf*_*226 13

使用 socket.io 2.2.0 更容易:

io.on('connection', function (socket) {
    console.log( socket.client.conn.server.clientsCount + " users connected" );
});
Run Code Online (Sandbox Code Playgroud)

干杯


Tri*_*IER 10

使用命名空间使用 Socket.IO v2.3.0 进行测试,我发现 4 个位置具有 clientCounts 属性(Server每次可能都是同一个对象):

const socketio = require('socket.io');
const io = socketio(http_server);

const io_namespace = io.of('/foobar');

io_namespace.on('connection', function(socket)
{
    console.log(socket.conn.server.clientsCount);
    console.log(socket.server.engine.clientsCount);
    console.log(io.engine.clientsCount);
    console.log(io_namespace.server.engine.clientsCount);
});
Run Code Online (Sandbox Code Playgroud)


小智 6

连接用户数与 socket.io 版本 - 1.3.7

const io = require("socket.io");

io.on('connection', (socket) => {
    console.log(io.sockets.server.httpServer._connections);  //output in number
    // or
    console.log(io.sockets.server.engine.clientsCount);  //output in number
});
Run Code Online (Sandbox Code Playgroud)


Lak*_*Raj 6

在花了相当多的时间阅读 Stack Overflow 帖子并多次查看套接字对象后,我发现要获取已连接的套接字数量,您需要执行以下操作:

// io is the 'require'd socket.io module

io.on("connection", function (socket) {
  console.log("The number of connected sockets: " + socket.adapter.sids.size);
});
Run Code Online (Sandbox Code Playgroud)

我已经在 上测试了这个非常简单的解决方案socket.io@4.0.1


lin*_*e-o 5

为什么在总是可以过滤数组时使用(隐式全局)变量,这是通过调用clients()方法返回的.

function filterNullValues (i) {
  return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;
Run Code Online (Sandbox Code Playgroud)

  • 感谢匿名downvote没有给出任何理由.它可能不是最好的方式,但也没有错. (5认同)

dev*_*anc 5

我目前正在使用 Socket.io v1.3.6 并发现它有效。它在用户连接和断开连接时给出准确的数字:

io.sockets.sockets.length
Run Code Online (Sandbox Code Playgroud)

像这样:

var io = require('socket.io').listen(server);
io.on('connection', function(socket) {
  console.log(io.sockets.sockets.length);
  socket.on('disconnect', function() {
    console.log(io.sockets.sockets.length);
  });
});
Run Code Online (Sandbox Code Playgroud)