Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有Node.js和Socket.io的唯一在线用户数_Node.js_Sockets - Fatal编程技术网

具有Node.js和Socket.io的唯一在线用户数

具有Node.js和Socket.io的唯一在线用户数,node.js,sockets,Node.js,Sockets,我正在开发一个应用程序,在这个应用程序中,我想向用户显示网站上当前在线的用户数量 对于已登录的用户,我有一个带有其用户id的已登录用户数组。我使用计数来显示已登录用户的数量。但这里有一个问题,当用户登录时,我将用户的用户id推送到数组中,当用户注销时将其删除。但是,如果用户不注销并关闭选项卡,它将留在那里。但当然,我可以做一些类似的事情,让一个用户表登录,在其中有一个最后看到的列,如果用户在过去5分钟左右处于非活动状态,则删除条目。但我想知道是否有更好的逻辑来做这件事 我试过: io.on( "

我正在开发一个应用程序,在这个应用程序中,我想向用户显示网站上当前在线的用户数量

对于已登录的用户,我有一个带有其用户id的已登录用户数组。我使用计数来显示已登录用户的数量。但这里有一个问题,当用户登录时,我将用户的用户id推送到数组中,当用户注销时将其删除。但是,如果用户不注销并关闭选项卡,它将留在那里。但当然,我可以做一些类似的事情,让一个用户表登录,在其中有一个最后看到的列,如果用户在过去5分钟左右处于非活动状态,则删除条目。但我想知道是否有更好的逻辑来做这件事

我试过:

io.on( "connection", function( socket )
{
    console.log( "A user connected" );
    console.log(io.engine.clientsCount);
    console.log(Object.keys(io.sockets.connected).length);
});
但是,如果一个用户打开了我的应用程序的10个选项卡,
io.engine.clientscont
Object.keys(io.sockets.connected)。length
返回10。那么,我该怎么做才能获得唯一的在线用户数量,而不管他们打开了多少个选项卡


编辑:我正在使用MySQL。

每个客户端都将使用唯一的套接字id创建一个新的套接字连接。不过,我不确定是否有可能获得“真实”用户的总数

一种更接近它的方法是将ip(或它的散列或任何内容)存储在列表中,并检查新连接的客户端是否已经连接。但也有可能是两个“真正的”用户在同一网络中使用来自两台不同计算机的页面,也就是说,他们共享公共IP

您可以检查客户端是否有某种方法可以从计算机获取更多特定于计算机的内容,例如mac地址,这样您就可以确定它是否至少是同一台计算机。但也可能是两个用户共享同一台计算机

这是一个很难破解的难题,就像计算一个页面的“真正”独特访问者一样。这一切都取决于它必须有多精确。
如果显示准确的真实用户并不是非常重要,那么您可以始终显示客户端的数量,并使用一个稍微偏离的数字


或者,您可以强制用户在任何时候登录socket.io服务器。通过这种方式,您可以计算唯一的登录用户,而不是客户端。

每个客户端将使用唯一的套接字id创建一个新的套接字连接。不过,我不确定是否可能获得“真实”用户的总数

一种更接近它的方法是将ip(或它的散列或任何内容)存储在列表中,并检查新连接的客户端是否已经连接。但也有可能是两个“真正的”用户在同一网络中使用来自两台不同计算机的页面,也就是说,他们共享公共IP

您可以检查客户端是否有某种方法可以从计算机获取更多特定于计算机的内容,例如mac地址,这样您就可以确定它是否至少是同一台计算机。但也可能是两个用户共享同一台计算机

这是一个很难破解的难题,就像计算一个页面的“真正”独特访问者一样。这一切都取决于它必须有多精确。
如果显示准确的真实用户并不是非常重要,那么您可以始终显示客户端的数量,并使用一个稍微偏离的数字

或者,您可以强制用户在任何时候登录socket.io服务器。这样,您就可以计算唯一的登录用户,而不是客户端