使用nodeJS和Socket.io计算没有重复项的在线用户数

时间:2017-11-29 20:59:55

标签: javascript node.js socket.io

我无法显示正确数量的在线用户。 A question similar to this告诉我,我可以这样计算用户:

child

我经常遇到的问题是,当用户碰巧重新加载页面太快时,计数器会拉得太多而无法丢弃。

enter image description here

正如您所看到的,在图像的右侧,用户发送了重新加载的垃圾邮件,并且在线吸引了比实际用户更多的用户。 (目前服务器上只有一个用户)

我的问题在没有使用var count = 0 socket.on('connection', function(client) { count++; client.broadcast({count:count}) client.on('disconnect', function(){ count--; }) }) / users++的情况下,如果没有额外的“虚拟用户”,有更好或更可靠的方式来计算用户在线的确切数量方法?

3 个答案:

答案 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