2013-08-16 14 views
1

我想在不活动2小时后断开用户与socket.io的连接,并给它们一个提示/重新连接按钮。不活动2小时后Socket.io自动断开

首先,我已设置自动重新连接到错误的和可变forcedc:

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,则意味着用户因网络问题/服务器重新启动而断开连接,浏览器应刷新页面以重新连接。

现在,当插座断开:

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

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

我在做什么错?

+1

你好,我写了一个小的应用程序与您的代码,它的工作等。除非你可以多分享一点(或者你想分享我自己的片段),我不认为我们是c一个数字它出错的地方。 – danielepolencic

+0

如果你改变* if(!forcedc){* to if(forcedc === false){* – Krasimir

+0

这会按照我的预期工作。这是你正在测试的确切代码吗? – user568109

回答

0

我想它必须与关闭... 你在哪里宣布强制?你整个代码中的那两个代码在哪里?

显然,forcedc变量没有更新,因为他们应该,这可能意味着他们中的一个是本地副本

+0

forcedc是全局声明的。 – apscience

+0

当您在断开连接事件侦听器中添加断点时,并且您正在查看forcedc变量的每个实例时,它们的值是否都一样? –

0

没有任何更多的细节很难回答的问题。 有没有另一个地方你在代码上使用forcedc?你可以尝试的一件事是把它放在一个对象中:namespace.forcedc = true强制关闭继承

1

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

可能的解决办法:申报dcTimeout与forcedc沿着一个全局变量这里有一个jsfiddle link供您参考我的测试代码

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); 
     } 
    }); 
}