【问题标题】:Socket.io auto disconnect after 2 hours of inactivity not working2 小时不活动后 Socket.io 自动断开连接不起作用
【发布时间】:2013-08-18 08:44:14
【问题描述】:

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

首先,我将自动重新连接设置为 false 和一个变量 forcec:

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,页面应该刷新。但是,即使用户由于不活动而已经“断开连接”,页面也会刷新(我知道强制c = true 已经执行,因为我看到了断开连接的模式)。

我做错了什么?

【问题讨论】:

  • 您好,我用您的代码编写了一个小应用程序,它按预期工作。除非你能多分享一点(或者你想分享我自己的 sn-p),否则我认为我们无法找出错误所在。
  • 如果将 if(!forcedc){ 更改为 if(forcedc === false){*
  • 这对我来说按预期工作。这是您正在测试的确切代码吗?
  • 问题是modal出现后页面自动刷新。

标签: node.js socket.io


【解决方案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);
      }
  });
}

【讨论】:

    【解决方案2】:

    我想它必须与闭包有关... 你在哪里声明forcedc?这两段代码在你的整个代码中在哪里?

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

    【讨论】:

    • forcedc 是全局声明的。
    • 当您在断开连接事件监听器中添加断点,并查看forcedc 变量的每个实例时,值是否都相同?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 2016-12-10
      • 2017-08-13
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多