我终于Socket.IO
正常工作,但我遇到了一个奇怪的问题。
我不确定这是否是最好的方法,但我正在使用:
io.sockets.clients().length
这将返回连接到我的服务器的客户端数。问题是在用户几次连接和断开连接后,数字开始保持高于应有的水平。
例如,如果我连接并要求我的朋友,数字就会上升,这是正确的。但是当我们开始断开连接并重新连接时,数量不会减少。
我在VMware Ubuntu服务器上运行Node.js
和Socket.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 版中找到了解决这个问题的方法。有以下三种方法:
-
io.engine.clientsCount
-
io.sockets.sockets.length
-
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)