Socket.io连接用户计数

时间:2012-04-23 06:13:19

标签: node.js websocket socket.io

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

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

io.sockets.clients().length

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

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

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

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

12 个答案:

答案 0 :(得分:58)

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

您可以从

获取连接的客户端数量
socketIO.engine.clientsCount

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

答案 1 :(得分:39)

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

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

之类的东西
socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });

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

答案 2 :(得分:26)

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

  1. io.engine.clientsCount
  2. io.sockets.sockets.length
  3. Object.keys(io.sockets.connected).length
  4. 希望这些可以帮助有同样问题的人。:)

答案 3 :(得分:5)

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

function filterNullValues (i) {
  return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;

答案 4 :(得分:4)

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

答案 5 :(得分:3)

另请参阅:

io.sockets.manager.connected

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

答案 6 :(得分:2)

在花了相当多的时间阅读 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 上测试了这个非常简单的解决方案。

答案 7 :(得分:1)

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

Mongoose架构:

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 );
    }
}); 

注意*我不喜欢使用空查询对象({})所以我只使用了{&#34; socket&#34; :1}作为假人而不是

答案 8 :(得分:1)

我目前正在使用带有typeScript的socket v1.4.29,你可以找到使用这个连接的客户端数量

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

答案 9 :(得分:1)

  

已连接用户的数量以socket.io版本-1.3.7

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
});

答案 10 :(得分:1)

使用socket.io 2.2.0更容易:

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

欢呼

答案 11 :(得分:0)

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