2小时不活动后,Socket.io会自动断开连接

我想在2小时不活动的情况下断开用户与socket.io的连接,并给他们提示/重新连接button。

首先,我已经设置了自动重新连接为false和variablesforcedc:

var socket = io.connect('https://coinchat.org:443',{secure: true, reconnect: false}); var forcedc = false; 

接下来,我有一个不活动的时间,有人移动鼠标时重置:

 $("body").mousemove(function(e){ clearTimeout(dcTimeout); dcTimeout = setTimeout(function(){ if(!forcedc){ forcedc = true; socket.disconnect(); $("#dcmodal").modal('show'); } }, 1000 * 60 * 60 * 2); }); 

基本上,forcedc意味着用户由于不活动而被断开,并且浏览器不应该刷新页面来尝试重新连接。 如果forcedc为false,则意味着用户由于networking问题/服务器重新启动而断开连接,浏览器应刷新页面以重新连接。

现在,当套接字断开时:

 socket.on("disconnect", function(data){ if(!forcedc){ setTimeout(function(){document.location.reload(true)}, 1000 + Math.random()*12750); } }); 

如果forcedc为false,页面应该刷新。 但是,即使用户由于不活动而已经“断开连接”,页面也会刷新(我知道forcedc = true已经被执行,因为我看到了断开的模式)。

我究竟做错了什么?

我相信dcTimeout永远不会通过'clearTimeout(dcTimeout);“得到清除,因此,dcTimeout被执行并且forcedc成为true。

可能的解决scheme:将dcTimeout声明为一个全局variables以及forcedc。 这里是我的testing代码jsfiddle链接供您参考。

 function communication() { var socket = io.connect('http://localhost:8080',{reconnect: false}); socket.on('connect', function () { var forcedc = false; var dcTimeout = null; console.log("connected to the server!"); socket.on('news', function (data) { console.log(data); }); socket.on("disconnect", function(data){ console.log("disconnected..") if(!forcedc){ console.log("forcedc is false and the socket has been disconnected"); setTimeout(function(){ console.log("Reloading the document in 2 seconds"); //document.location.reload(true) }, 2000); } }); document.onmousemove = function(e){ console.log("mouse movement detected"); clearTimeout(dcTimeout); dcTimeout = setTimeout(function(){ if(!forcedc){ forcedc = true; console.log("disconnecting...setting to true"); socket.disconnect(); //$("#dcmodal").modal('show'); console.log("Disconnected! Do you want to reconnect?"); } }, 5000 * 1); } }); } 

我想这应该是closures…你在哪里宣布强制? 你整个代码中的那两个代码在哪里?

显然,forcedcvariables不会更新,这可能意味着其中一个是本地副本

没有更多的细节,很难回答。 有没有另一个地方你使用代码forcedc? 你可以尝试的一件事是把它放在一个对象:namespace.forcedc = true强制闭包inheritance