【问题标题】:socket.io best way to track if a user is onlinesocket.io 跟踪用户是否在线的最佳方法
【发布时间】:2015-09-29 21:16:29
【问题描述】:

如果用户有套接字连接,我需要更新一些客户端的东西。

目前,当用户连接他“登录”时,我正在向所有人广播


客户端(可以在服务器端执行并获得相同的结果)

// announce to everyone the user is online
socket.on('connect', function() {
  socket.emit('im online');
});

服务器端

io.sockets.on('connection', function (socket) {

    socket.on("im online", function (data) {
        // announce the online status of a new user
        socket.broadcast.emit('connected user',  {"name": socket.handshake.headers.user.username});
    });

});

问题是,现在我加载了页面,让所有人都知道我“在线”,因为页面的加载会触发事件,但是如果我是偶像并且另一个用户重新加载了他/她的页面,我不会触发任何事情,所以没有迹象表明我在线。

所以我在想服务器端我可以捕获所有访问 connection 的用户的数组,并将该数组发送给任何连接的新客户端,并使用它与用户朋友列表进行比较,看看是否任何用户名匹配(顺便说一句,用户名在每种情况下都是 100% 唯一的)

然后,当用户断开连接时,我可以将其从阵列中删除并让客户端知道。

这将是我的解决方案,但它似乎非常无效,我希望有更好的解决方案。

【问题讨论】:

  • 您几乎肯定会希望使用后一种方法来跟踪服务器上当前连接的用户。当新用户连接时,向他们发送所有客户端的完整列表,但向其他所有人发送单个 UserConnected/UserDisconnected 通知,并让连接的用户更新他们的本地列表。

标签: javascript node.js sockets


【解决方案1】:

您也可以轻松广播断开连接事件:

socket.on("disconnect", function (data) {
    // announce the offline status of a new user
    socket.broadcast.emit('disconnected user',  {"name": socket.handshake.headers.user.username});
});

客户端断开连接时,服务器端会自动生成断开连接事件。

另一方面,您可能必须在服务器端存储所有已连接的用户,否则新连接的用户将不会收到已连接的其他用户的通知。

【讨论】:

  • 是的,这正是问题"On the other hand probably you have to store on server side all the connected users, because otherwise the newly connected users wouldn't be notified about the already connected others." 可能有100个用户,但我只有3个朋友,所以现在我向客户端发送一个100的数组并检查客户端存在哪些朋友.
  • 我已经知道断开连接事件,问题出在我刚才引用的内容中。我正在尝试找出一个最好地存储此服务器端并进行通信的解决方案。
  • 你可以在服务器端过滤好友,在连接时只发送过滤后的列表给客户端,但以后你可以只发送连接/断开的事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多