Socket.io连接用户数

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

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

io.sockets.clients().length 

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

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

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

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

       

网上收集的解决方案 "Socket.io连接用户数"

这有一个Github的问题 。 问题是,每当有人断开socket.io不删除(拼接)数组,但简单地设置为“null”的值,所以实际上你有很多的空值在你的数组,这使你的客户端)。长度比现实中的连接长。

你必须pipe理不同的方式来计算你的客户,例如类似的东西

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

这是一个嗡嗡声,为什么在socket.io背后的人已经离开了这样的事情,但最好解释在github问题,我张贴作为一个链接!

以防万一有人在使用socket.io版本1.0时进入此页面

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

 socketIO.engine.clientsCount 

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

我已经find了解决1.3.7版本的方法。 有三种方法如下:

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

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

也看看:

io.sockets.manager.connected

这是一个关键值对的清单(套接字ID和连接状态?)

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

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

不知道这个数字对不同的边缘情况有多准确,但直到现在看起来准确:连接的每一个浏览器都增加了数量,每个浏览器closures都减less了。

为什么总是使用(隐式全局variables)variables来过滤通过调用clients()方法返回的数组。

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

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

我没有看到多核心应用程序的任何提及,所以我只是补充一点,因为我使用多个核心(集群),我无法在客户端一直获得正确数量的套接字,所以我结束了把它们保存到我的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 ); } }); 

注意*我不喜欢使用空查询对象({}),所以我只是使用{“socket”:1}来代替虚拟对象