首页 > 解决方案 > 为什么 JS 中的 WebSocket 在手机睡眠后从同一个选项卡连接失败但从另一个选项卡成功连接

问题描述

我使用以下愚蠢的代码来建立或聊天 WS 连接。定时器定期调用函数 check() 并new WebSocket在需要时创建对象。“需要”定义为“readyState != CONNECTED (1)”。这在 chrome/firefox 中运行良好,除了手机睡眠一段时间后的移动 chrome。如果您在onerror()/onopen()/onclose()函数中打印调试消息,您将在手机睡眠后在连接成功之前获得大约 300 次尝试。创建后new Websocket它立即调用onerror()+ onclose(),就好像 Internet 链接已关闭一样。在 check() 调用了 ~200...300 次之后,它最终创建WebSocket了成功调用的对象onopen,所以我需要在互联网链接 UP 和手机唤醒后等待几分钟。

如果我从另一个选项卡使用相同的代码打开相同的网页,该选项卡会立即通过此代码通过 websocket 连接!似乎旧选项卡进入了一些有趣的状态,其中 WS 连接被禁止了几分钟。

所以,问题是为什么会发生这种情况。

var connection = null;

function check () {
  setTimeout(check, 1111);
  if(null != connection) {
    if(1 == connection.readyState) {
      return;
    }
    connection.close();
    connection = null;
  }

  addr = "ws://myrealdomainname.com/ws/";
  connection = new Websocket(addr);
  connection.onclose = onclose;
  connection.onerror = onerror;
  connection.onmessage = onmessage;
  connection.onopen = onopen;
}

标签: websocket

解决方案


推荐阅读