繁体   English   中英

断开触发器之前检查客户端重新连接

[英]Check for Client Reconnection Before Disconnect Triggers

因此,我试图实时显示我的在线播放器,到目前为止,除了一个问题之外,它的运行情况非常好。 当我的应用监听断开连接时,页面刷新似乎触发了此功能,并且该播放器已注销。

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”,以便检查页面是否已重新加载还是关闭? 重新加载将立即进行重新连接,因此我只需要检查是否存在所述重新连接。 我就是不知道!

感谢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")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM