Socket.IO 连接的用户计数



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

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

io.sockets.clients().length

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

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

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

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

以防

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

您可以从以下位置获取连接的客户端计数

socketIO.engine.clientsCount

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

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

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

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

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

我已经在 1.3.7 版中找到了解决这个问题的方法。有以下三种方法:

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

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

使用 socket.io 2.2.0 更容易:

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

干杯

使用命名空间使用 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);
});

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

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

编辑使用较短的语法

已连接用户数与 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
});

在花了很多时间阅读 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);
});

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

我目前正在使用 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);
  });
});

另请查看:

io.sockets.manager.connected

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

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

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

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

我目前正在将套接字 v1.4.29 与 typeScript 一起使用,您可以使用它找到连接的客户端数量

 io.sockets.on('connection', function(socket) {
 var clients = socket.client.conn.emit.length;
 console.log("clients: " + clients);
 });
我没有

看到任何提到多核应用程序的内容,所以我只想补充一点,因为我使用的是多核(集群),我无法在客户端始终如一地获得正确数量的套接字,所以我最终将它们保存到我的 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 } 作为虚拟

对象

返回连接的客户端总数

console.log(io.engine.clientsCount)

相关内容

  • 没有找到相关文章

最新更新