websocket - 为什么 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;
}
解决方案
推荐阅读
- node.js - 未定义:即使使用 upload.single() 中间件,req.file() 也会输出未定义
- regex - 我需要匹配一个不以特定字符集(文件扩展名)结尾的字符串
- ada - Ada 编程语言的 GUI
- html - 如何将颜色渐变应用到 .SVG 图像?
- android - 应用内结算的 Android 开发者通知
- r - 根据条件子集中的行号编辑 data.table 列
- javascript - 在数组中添加星号?
- regex - 如何在 Sublime 3 中以连续的方式在许多相关文件上自动增加/添加/重新编号?
- android - PC 崩溃后 Android Studio 出现错误
- java - 设置属性“java.io.tmpdir”会导致测试失败