在断网的时候,websocket 一直在CLOSING 状态

现象

websocket 先连接成功,然后断网。

由于维护了一套心跳机制,前端发起心跳,如果一段时间内没有收到服务端返回的心跳。则表示连接断开。

用心跳的方式处理断网的兜底情况。

然而,此时网络是断开的,在代码中直接调用websocket.close() 方法,会发现,websocket.readyState 会一直在 WebSocket.CLOSING 状态,等很久也不会触发onclose 回调。

只有网络通的时候才会触发 websocket onclose。

这样会触发不了我的重连逻辑。因为重连逻辑做在onclose 回调里面。

解决

通过定时器检查websocket 的状态,如果在几秒钟之后,还是 CLOSING 状态,则直接调用onclose 的回调。

onclose 的回调有一个参数,可以通过 new CloseEvent 来模拟,代码如下。

javascript 复制代码
const ws = new WebSocket('ws://xxxx');

ws.onclose = onclose;

function onclose(e){}


// 可以在检测到closing 状态超时了后,主动调用onclose 回调,自行模拟event

onclose(new CloseEvent('close', {
    wasClean: false,
    code: 3000,
    reason: 'websocket closing timeout',
}))

还要注意的是,在重新new Websocket 之前,要清除当前的websocket实例,其中的各种回调要置为null (onopen, onclose, onerror, onmessage)

因为等到重连的时候,这个CLOSING 状态的ws实例会触发onclose,导致onclose回调中的内容被重复执行。

参考

相关推荐
爱吃小白兔的猫6 分钟前
【基础篇三】WebSocket:实时通信的革命
网络·websocket·网络协议
21号 114 分钟前
4.应用层自定义协议与序列化
运维·服务器·网络
老六ip加速器17 分钟前
如何给电脑换个ip地址?电脑换ip几种方法
网络协议·tcp/ip·电脑
云畅新视界21 分钟前
HOTDOG构建“IP×用户”共创生态,激活数字文化新势能
网络·网络协议·tcp/ip
无线图像传输研究探索38 分钟前
单兵图传终端:移动场景中的 “实时感知神经”
网络·人工智能·5g·无线图传·5g单兵图传
深蓝海拓1 小时前
通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus等
网络·网络协议·tcp/ip
xx.ii1 小时前
4.Linux 应用程序的安装和管理
linux·服务器·网络
奋斗的蛋黄2 小时前
解析分区、挂载与块设备:Linux 存储管理核心命令详解
linux·服务器·网络
专家大圣4 小时前
轻量级远程开发利器:Code Server与cpolar协同实现安全云端编码
网络·docker·树莓派·香橙派·casaos·code server
hjh198294 小时前
复现cacti的RCE
网络·安全·php