在断网的时候,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回调中的内容被重复执行。

参考

相关推荐
anew___4 小时前
《从零手写操作系统 (63):安全与加固——从内核保护到沙箱隔离》
网络·安全
Lzg_na4 小时前
VXLAN:背景、机制、报文字段与主机转发流程
网络
乐维_lwops6 小时前
案例解读:大型综合性科创产业园运维监控落地实践
运维·网络·人工智能·安全·it监控·国产运维智能体
m0_715674438 小时前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
大数据·网络·人工智能·安全·网络安全·政务
AI 编程助手GPT8 小时前
curl 返回成功就能收文件?用本地 HTTP 验证错误页与超时
网络·网络协议·http
十碗饭吃不饱9 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络
流浪0019 小时前
计算机网络篇16:传输层——TCP 报头属性字段:16 位窗口大小撑起流量控制,六个标志位标识报文类型
网络协议·tcp/ip·计算机网络·urg紧急指针·tcp报头
从琳开始98911 小时前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php
Jongkhurun13 小时前
以太网的最小帧长为什么是 64 字节:从 CSMA/CD 冲突窗口推导 64 Byte
网络协议
xiaoye-duck13 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(下):流式响应实现和测试
网络·c++·语言模型·chatgpt