54

我终于可以正常工作了Socket.IO,但是我遇到了一个奇怪的问题。

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

io.sockets.clients().length

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

例如,如果我连接并要求我的朋友连接,数字会上升,这是正确的。但是当我们开始断开连接并重新连接时,数量并没有减少。

我在VMware Ubuntu服务器上运行Node.jsand服务器。Socket.IO

为什么会这样或者是否有更好的方法来找出有多少人连接到服务器?

4

14 回答 14

67

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

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

socketIO.engine.clientsCount

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

于 2014-12-10T18:57:27.203 回答
51

这有一个github问题。问题是,每当有人断开 socket.io 的连接时,都不会从数组中删除( splice ),而只是将值设置为“null”,因此实际上您的数组中有很多 null 值,这会使您的客户( ).length 比您在现实中拥有的连接更大。

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

socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });

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

于 2012-04-23T07:26:52.590 回答
37

我在 1.3.7 版本中找到了解决方法。有以下三种方法:</p>

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

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

于 2015-10-08T01:59:07.783 回答
13

使用 socket.io 2.2.0 更容易:

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

干杯

于 2019-03-21T14:35:39.567 回答
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);
});
于 2019-12-27T02:11:32.700 回答
8

当您始终可以过滤数组时,为什么要使用(隐式全局)变量,该数组是通过调用 clients() 方法返回的。

io.sockets.clients().filter(c => !!c).length;

编辑使用更短的语法

于 2013-09-17T22:21:34.750 回答
7

使用 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
});
于 2018-08-24T11:10:25.417 回答
5

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

io.sockets.sockets.length

像这样:

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);
  });
});
于 2015-08-07T03:28:09.497 回答
4

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

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

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

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

于 2021-04-07T21:26:00.207 回答
3

我正在使用 socket.io 0.9.10 和以下代码来确定套接字的数量:

var socketIO =  require('socket.io').listen( .....
var numberOfSockets = Object.keys(socketIO.connected).length;

不确定这个数字对各种边缘情况的反应有多准确,但直到现在它似乎是准确的:每个连接的浏览器都会增加这个数字,每个关闭的浏览器都会减少它。

于 2012-09-20T13:50:04.617 回答
3

还可以看看:

io.sockets.manager.connected

这是一个干净的键值对列表(套接字 id 和连接状态?)

于 2012-09-28T23:21:15.307 回答
1

我没有看到任何关于多核应用程序的提及,所以我只想补充一点,因为我使用的是多核(集群),所以我无法在客户端始终获得正确数量的套接字,所以我结束了将它们保存到我的 mongo 实例中,它非常一致和准确。使用这种方法,我可以通过浏览器查看我的套接字连接:)。

猫鼬模式:

var socketSchema = mongoose.Schema({
        socket : Number
});

用法:

//reset to 0 when the app starts ( just in case )
SocketModel.find({ "socket" : 1 } , function(err, deadSockets ) {
    if (err){
        console.log( err );
    }
    else{
        for( var i = 0 ; i < deadSockets.length ; i++ ){
            deadSockets[i].remove();                
        }
    }
});

io.on('connection', function( socket ) {
    //I found I needed to make sure I had a socket object to get proper counts consistantly
    if( socket ){
        var socketEntry = new SocketModel({ "socket" : 1 });
        socketEntry.save( function(err ){
            if (err){
                console.log( err );
            }
            else{
        
            }
        });
    }
    //On Disconnect
    socket.on('disconnect', function() {
        SocketModel.findOne({ "socket" : 1} , function(err, deadSocket ) {
            if (err){
                console.log( err );
            }
            else{
                deadSocket.remove();
            }
        }); 
    });
});

我有几个?

SocketModel.count({ "socket" : 1 } , function(err, count ) {
    if (err){
        console.log(err);
    }
    else{
        var term = "sockets";
        if( count == 1 ) term = "socket";
        console.log("Current Load: " , count , term );
    }
}); 

注意我不喜欢使用空查询对象 ( {}) 所以我只是用作{ "socket" : 1 }一个虚拟对象

于 2015-09-30T22:13:47.817 回答
1

我目前正在使用带有 typeScript 的套接字 v1.4.29,您可以使用此找到连接的客户端数量

 io.sockets.on('connection', function(socket) {
 var clients = socket.client.conn.emit.length;
 console.log("clients: " + clients);
 });
于 2018-03-30T06:18:43.090 回答
0

返回已连接客户端的总数

console.log(io.engine.clientsCount)
于 2022-03-05T18:36:12.797 回答