Socket.io自动断开连接2小时后无法正常工作

时间:2013-08-16 02:29:36

标签: node.js socket.io

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

首先,我将自动重新连接设置为false,并将变量设置为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为false,页面应该刷新。但是,即使用户由于不活动而已经“断开连接”,页面也会刷新(我知道forcedc = true已执行,因为我看到断开连接的模式)。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

可能的解决方案:将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);
      }
  });
}

答案 1 :(得分:0)

我想它必须与闭包...... 你在哪里宣布被迫?你整个代码中的那两段代码在哪里?

显然,forcedc变量没有按照应有的更新,这可能意味着其中一个是本地副本

答案 2 :(得分:0)

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

相关问题