Nodejs实时在线用户计数器
Nodejs real time online user counter
我有一个网站并使用 nodejs 和 socket.io 实现了一个实时在线用户计数器。这是代码:
$io.on('connection', function (socket) {
var $ip_address = socket.handshake.address;
if ($ips_connected.hasOwnProperty($ip_address)) {
$ips_connected[$ip_address]++;
} else {
$ips_connected[$ip_address] = 1;
$connected_users++;
if ($connected_users > $max_users)
$max_users = $connected_users;
}
socket.emit('update', $connected_users);
socket.on('disconnect', function () {
if ($ips_connected.hasOwnProperty($ip_address)) {
$ips_connected[$ip_address]--;
if ($ips_connected[$ip_address] <= 0) {
delete $ips_connected[$ip_address];
$connected_users--;
}
}
});
socket.on('update', function () {
socket.emit('update', $connected_users);
});
});
如您所见,我不考虑通过同一 IP 地址进行的多个连接。此代码的问题是 Google Analytics 实时数据显示的数字小于 nodejs 计算的数字。
我需要的是对已经使用 nodejs 实现类似功能的人的解释,告诉我我是否可以信任这段代码,或者我应该信任 Analytics 实时计数器。我正在使用此代码向我的用户显示当前连接到我网站的用户数量,因此我不想显示错误的数字。
更新
我忘了说分析显示的数字比我自己的计数器少了 30 个单位。
我在某些浏览器(如 IE8、IE6 和其他浏览器)中看到过不记得的情况...socket.io 打破 connection
并在不调用 disconnect
的情况下自动重新启动。
我对你的建议是为每个连接生成一个唯一的 id,以控制这是否真的是一个新连接。
我有一个网站并使用 nodejs 和 socket.io 实现了一个实时在线用户计数器。这是代码:
$io.on('connection', function (socket) {
var $ip_address = socket.handshake.address;
if ($ips_connected.hasOwnProperty($ip_address)) {
$ips_connected[$ip_address]++;
} else {
$ips_connected[$ip_address] = 1;
$connected_users++;
if ($connected_users > $max_users)
$max_users = $connected_users;
}
socket.emit('update', $connected_users);
socket.on('disconnect', function () {
if ($ips_connected.hasOwnProperty($ip_address)) {
$ips_connected[$ip_address]--;
if ($ips_connected[$ip_address] <= 0) {
delete $ips_connected[$ip_address];
$connected_users--;
}
}
});
socket.on('update', function () {
socket.emit('update', $connected_users);
});
});
如您所见,我不考虑通过同一 IP 地址进行的多个连接。此代码的问题是 Google Analytics 实时数据显示的数字小于 nodejs 计算的数字。
我需要的是对已经使用 nodejs 实现类似功能的人的解释,告诉我我是否可以信任这段代码,或者我应该信任 Analytics 实时计数器。我正在使用此代码向我的用户显示当前连接到我网站的用户数量,因此我不想显示错误的数字。
更新
我忘了说分析显示的数字比我自己的计数器少了 30 个单位。
我在某些浏览器(如 IE8、IE6 和其他浏览器)中看到过不记得的情况...socket.io 打破 connection
并在不调用 disconnect
的情况下自动重新启动。
我对你的建议是为每个连接生成一个唯一的 id,以控制这是否真的是一个新连接。