我无法显示正确数量的在线用户。 A question similar to this告诉我,我可以这样计算用户:
child
我经常遇到的问题是,当用户碰巧重新加载页面太快时,计数器会拉得太多而无法丢弃。
正如您所看到的,在图像的右侧,用户发送了重新加载的垃圾邮件,并且在线吸引了比实际用户更多的用户。 (目前服务器上只有一个用户)
我的问题在没有使用var count = 0
socket.on('connection', function(client) {
count++;
client.broadcast({count:count})
client.on('disconnect', function(){
count--;
})
})
/ users++
的情况下,如果没有额外的“虚拟用户”,有更好或更可靠的方式来计算用户在线的确切数量方法?
答案 0 :(得分:3)
如果他们以用户身份登录,那么您应该对套接字进行身份验证。使用该身份验证查看他们是否已有会话,并在使用新会话再次递增之前断开连接,减少计数。
以下示例。 clients
对象存储连接的客户端,其值是它们连接的套接字。
var clients = {};
socket.on('connection', function(client) {
//Authenticate the client (Using query string parameters, auth tokens, etc...), and return the userID if the user.
var userId = authenticate(client);
if ( !userId ) {
//Bad authentication, disconnect them
client.disconnect();
return;
}
if (clients[userId]) {
//They already have a session, disconnect
clients[userId].disconnect();
//Set updated session here
clients[userId] = client;
}
client.broadcast({count: Object.keys(clients).length})
client.on('disconnect', function(){
delete clients[userId];
})
})
答案 1 :(得分:2)
可以使用Observable模式(在这里使用RxJS v5)非常干净地执行此操作:
const { Observable } = require('rxjs')
const connections = Observable.fromEvent(socket, 'connection').mapTo(1)
const disconnections = Observable.fromEvent(socket, 'disconnect').mapTo(-1)
// emit 1 for connection, -1 for disconnection
Observable.merge(connections, disconnections)
.scan((total, change) => total + change, 0) // emit total
.subscribe(count => client.broadcast({ count }))
答案 2 :(得分:0)
您确实可以为此目的使用服务器发送事件。 看看https://javascript.info/server-sent-events