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

参考

相关推荐
ROCKY_8171 小时前
计算机网络考试考点——应用层
服务器·网络·计算机网络
这个人需要休息2 小时前
xss的漏洞类型+dvwa DOM xss各难度的小总结
网络·安全
q***61412 小时前
详解 为什么 tcp 会出现 粘包 拆包 问题
网络·tcp/ip·php
HONG````2 小时前
鸿蒙应用HTTP网络请求实战指南:从基础到进阶优化
网络·http·harmonyos
v***44672 小时前
PLC(电力载波通信)网络机制介绍
开发语言·网络·php
世界尽头与你2 小时前
CVE-2014-3566: OpenSSL 加密问题漏洞
网络·安全·网络安全·渗透测试
L***B5682 小时前
SQL 注入漏洞原理以及修复方法
网络·数据库·sql
ZeroNews内网穿透2 小时前
ZeroNews IP 访问控制能力
服务器·网络·网络协议·tcp/ip·安全·web安全·小程序
车载测试工程师2 小时前
CAPL学习-DoIP测试仪配置函数
网络协议·以太网·capl·canoe·doip
vortex52 小时前
网站压缩包上传解压功能的漏洞剖析
网络·安全·web安全