【问题标题】:Keeping track of online/offline status in real-time with NowJS/Node.js?使用 NowJS/Node.js 实时跟踪在线/离线状态?
【发布时间】:2012-01-17 01:49:52
【问题描述】:

我有一个用户登录并在所有页面上连接到 NowJS 的站点。我希望能够近乎实时地跟踪他们的状态(在线/离线),但我不确定最好的方法。我最初的想法是只使用连接和断开连接事件,但这不会起作用,因为每次用户进入新页面时都会触发这些事件(因为在新页面加载时套接字连接已关闭)。

我在数据库条目中为该用户记录断开连接事件的时间戳,然后当连接事件触发时,我检查他们是否在过去 30 秒内访问过该站点。如果他们没有,我可以假设他们正在开始一个新的会话。在断开连接事件中,我使用 setTimeout 查看他们在 30 秒后是否仍然在线,如果没有,则将其状态设置为离线。

虽然这主要是可行的,但它似乎有点 hacky,并且有几个边缘情况问题可能是有问题的(更不用说您将在每个页面视图上都有一个新的超时服务器端的事实)。有没有更好的方法来做到这一点,我只是忽略了?

【问题讨论】:

  • 新页面 = 新的套接字连接。跟踪每个用户的连接,如果他们打开了另一个套接字,则忽略断开连接。听起来对吗?
  • 我实际上已经这样做了,但是仍然存在一个问题,如果他们只打开一页并且只是单击链接,他们就没有打开任何连接。我目前将用户的所有连接存储在一个以用户 ID 作为名称的组中。

标签: javascript node.js nowjs-sockets


【解决方案1】:

执行此操作的正确方法不仅仅取决于“是否存在打开的连接”。您是否试图向其他用户显示是否有人在附近/是否可以聊天/其他?然后,您可能还会考虑页面本身的不活动超时(以捕获人们在没有关闭页面的情况下离开计算机的时间)。如果您正在做其他事情,例如计量使用情况,您可能需要不同的机制。

【讨论】:

  • 是的,但这更像是一个附加功能,而不是知道他们是否在线的核心功能。试图使示例尽可能简单。
【解决方案2】:

我认为这里的解决方案是扩展 Socket.IO 的超时选项(NowJS 在内部使用它)或者使用你的 hacky 解决方案和 setTimeout。

老实说,考虑到用户可以快速移动到另一个页面,这似乎是最好的解决方案。

【讨论】:

  • 你是说 socket.io 有办法在服务器上触发断开事件直到某个时间段发生?
  • 是的,看这里github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO 的心跳超时和关闭超时参数。
  • 它们的默认值分别是 15 秒和 25 秒,所以除非我遗漏了什么,否则不幸的是,这不会起到作用。
  • 所以你可以自己使用 Socket.IO(NowJS 只是一个抽象)并自己设置超时(修改默认值)或者你可以做你的“技巧”,设置一个超时在断开连接。 (可以说延长断开连接)
  • 不,我的意思是 socket.io 中的默认值是 15 和 25 秒。这些超时似乎只是与重新连接有关,它们不会在页面之间产生任何影响,因此无论设置为什么,断开连接事件仍然会立即被触发(同样,除非我看错了)。跨度>
【解决方案3】:

我最终做的是创建一个全局对象,该对象将用户的持久 ID(因此在本例中为他们在 MongoDB 中的 ObjectId)保存为键,并将 setTimeout 的引用作为值。然后我在“连接”事件上执行 clearTimeout 并在对象被认为离线时从对象中删除键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2019-01-26
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多