【问题标题】:Check for Client Reconnection Before Disconnect Triggers在断开连接触发器之前检查客户端重新连接
【发布时间】:2014-07-05 06:41:16
【问题描述】:

所以我正在尝试实时显示我的在线播放器,到目前为止它运行良好,除了一个问题。当我的应用程序侦听断开连接时,似乎页面刷新触发了此功能并且所述播放器已注销。

app.io.route("disconnect", function(req,res) {
    db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user));
    req.io.broadcast("event", {msg:req.session.username+" has logged out!"});
    app.io.broadcast("reloadXY");
    req.session.destroy();
});

为什么页面刷新会触发此功能? (我知道它是这个功能,因为玩家退出的唯一其他方式是通过退出链接)我怎样才能让它忽略页面刷新而只捕获断开连接,比如关闭浏览器?

编辑:如何“ping”重新连接事件,以便检查页面是否重新加载与关闭?重新加载将立即重新连接,因此我只需要检查所述重新连接。我就是不知道怎么办!

【问题讨论】:

  • 就web sockets而言,刷新页面就像关闭浏览器一样。您可能需要重新考虑检测用户断开连接的策略。例如:不仅使用断开事件,还具有超时值。如果用户在断开连接后 X 秒内没有重新连接到您的服务器,则表示您广播了断开连接消息。
  • @TimCooper 我只是在阅读类似的内容,但在创建测试用例时遇到了麻烦。你有关于重新连接测试的 express.io 文档吗?

标签: javascript node.js express.io


【解决方案1】:

感谢 Zirak(还有 Tim Cooper,虽然当时我不明白他的意思),我才能够解决这个问题。他建议我在会话中存储断开连接超时,当重新连接时(由于页面重新加载而立即发生),只需在它自动注销播放器之前清除超时。

app.io.route("stopDisconnection", function(req) {
    if (req.session) {
        clearTimeout(req.session.disconnection);
        console.log("Timeout cleared");
    }
});

app.io.route("disconnect", function(req) {
    req.session.disconnection = setTimeout(function() {
        console.log("User timed out!");
        db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user));
        app.io.broadcast("event", {msg:req.session.username+" has logged out!"});
        app.io.broadcast("reloadXY");
        req.session.destroy();
    },5000);
});

只需在 index.html 上调用 io.emit("stopDisconnection")

这样,您就可以成功触发断开功能,而不必担心页面刷新也会触发事件。

【讨论】:

  • 结论:动态语言是最好的。你永远不能在 Java 上做这样的事情(只是在这里选择一些随机语言......)。
  • 5秒不是很短吗?用户重新加载页面、重新连接到套接字以及“stopDisconnection”消息返回服务器的时间对于本地开发人员来说可能很短,但对于速度较慢的用户来说还不够。
  • @FlorianMargaine 是的,我很担心。如果/当出现问题时可能会扩展它
猜你喜欢
  • 1970-01-01
  • 2014-04-14
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2017-07-17
  • 2022-11-07
  • 1970-01-01
相关资源
最近更新 更多