我正在开发一个应用程序,我希望向用户显示网站上当前在线的用户数。
对于已登录的用户,我有一组已登录的用户及其用户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.clientsCount
和Object.keys(io.sockets.connected).length
将返回10.那么,无论他们有多少个标签,我该如何才能在线获得唯一的用户数量开。
答案 0 :(得分:1)
每个客户端都将创建一个具有唯一套接字ID的新套接字连接。我不确定是否有可能获得"真实的"用户虽然。
接近它的一种方法是将ip(或其哈希值或其他内容)存储在列表中,并检查新连接的客户端是否已连接。但它可能是两个真实的"用户使用来自同一网络中的两台不同计算机的页面,例如,它们共享公共IP。
您可以检查客户端是否有某种方式从计算机获取更多计算机特定内容,比如说一个mac地址,这样就可以确定它是否至少是同一台计算机。但它仍然可能是两个用户共享同一台计算机...
这是一个难以破解的问题,就像计算"真实"页面的唯一访问者。这一切都取决于它的确切程度 如果显示确切的真实用户不是非常重要,那么您可以随时显示客户端数量,并使用可能稍微偏离的数字。
或者,您可以强制用户在想要连接到socket.io服务器时进行登录。这样,您可以计算唯一登录用户而非客户端。