前端连接websocket失败_websocket连接失败后多久会触发error事件?
问题描述
websocket连接失败后多久会触发error事件?这个时间有没有方法可以设置
问题出现的环境背景
最近项目中用到了websocket,但是连接地址的端口不确定,因此前端需要从某个端口(例如ws://127.0.0.1:9000)开始累加去建立连接,然后通过onerror事件判断连接是否成功,但运行时发现从尝试连接到连接失败触发error事件的时间比较久,大概需要1s。这样如果枚举100次才连接成功,就需要占用100s的时间,效率太慢不可行。function connectWebSocket(port = 9900) {
return new Promise((resolve, reject) => {
if (ws && ws.readyState === WebSocket.OPEN) {
resolve(ws)
} else {
// 尝试建立连接
console.log('connect', '-------', Date.now())
ws = new WS(`ws://127.0.0.1:${port.toString()}`)
ws.onopen = () => {
// 连接成功
console.log('open', '-------', Date.now())
resolve(ws)
}
// 连接失败触发回调
ws.onerror = () => {
console.log('error', '-------', Date.now())
reject()
}
}
}).catch(() => {
// 累加端口重建websocket
if (port < 65534) {
const newPort = port + 1
return connectWebSocket(newPort)
} else {
ws.close()
ws = null
throw new Error('无法连接服务器')
}
})
}
尝试方法
运行发现open事件大概在建立连接20ms后触发,所以我试图通过setTimeout的方式来代替error事件,代码如下:function connectWebSocket(port = 9900) {
return new Promise((resolve, reject) => {
// 加入isOpen变量来websocket是否握手成功
let isOpen = false
if (ws && ws.readyState === WebSocket.OPEN) {
resolve(ws)
} else {
console.log('connect', '-------', Date.now())
ws = new WS(`ws://127.0.0.1:${port.toString()}`)
ws.onopen = () => {
// 握手成功设置标识为true
isOpen = true
console.log('open', '-------', Date.now())
resolve(ws)
}
// 需要确保定时器的回调在open事件之后执行
setTimeout(() => {
console.log(5, '-------', Date.now(), isOpen)
if (!isOpen) {
// 如果isOpen为false,说明没有握手成功,接着递归建立连接
ws.close()
reject()
}
}, 20)
// ws.onerror = () => {
// console.log('error', '-------', Date.now())
// reject()
// }
}
}).catch(() => {
if (port < 65534) {
const newPort = port + 1
return connectWebSocket(newPort)
} else {
ws.close()
ws = null
throw new Error('无法连接服务器')
}
})
}
通过以上代码可以把判断是否需要重连的时间压缩到20ms左右,但问题在于我不确定open的触发时机能不能保证在20ms内(可能与电脑性能有关?)。
这种方式是否可行呢,或者定时器的时间设置为多少比较合适。
前端连接websocket失败_websocket连接失败后多久会触发error事件?相关推荐
- Datagridview代码设置选中行后,没有触发SelectionChanged事件
不知道大家有没有遇到过这个问题,在winform开发软件的过程中,使用Datagridview代码设置选中行后,没有触发SelectionChanged事件,但是通过界面点击单元格或者选中行却是可以触 ...
- 用户端无法连接 WebSocket connection to ‘ws://xxxx.xx.com:2345/‘ failed:Error in connection establish
1.确认访问地址 访问的地址不能是服务器的域名,需要真实的服务器ip 看看官网文档: 2.关闭linux防火墙 systemctl stop firewalld.service 3.服务器上开放端口 ...
- 服务器连接失败 请修复后重试,守望先锋无法连接服务器...正在重试连接修复方法...
守望先锋无法连接服务器...正在重试连接修复方法 守望先锋正式开启内测,想必很多小伙伴都已经体验过了,但是也有很多朋友发现守望先锋无法连接服务器,显示正在重试的问题,那么下面小编就为大家介绍解决这方面 ...
- 实践案例丨Pt-osc工具连接rds for mysql 数据库失败
本文分享自华为云社区<Pt-osc工具连接rds for mysql 数据库失败>,原文作者:云技术搬运工 . [现象] 主机可以telent 通rds 端口,并且使用mysql-clie ...
- websocket握手失败_WebSocket握手期间出错:意外的响应代码:500
WebSocket握手期间出错:意外的响应代码:500 我在我的网站上使用websocket,但随机发送给我以下错误消息: WebSocket连接到'ws://client.mydomain.com/ ...
- 服务器网口显示感叹号,业务服务器或更新服务器连接失败(认证失败,黄色感叹号)怎么回事?...
问题截图如下: 造成此问题原因有如下几种: 1.当前连接的节点服务器与网吧当前网络之间延迟过高或丢包率较高,造成间接性认证失败,可在接入节点中点击测试按钮,选择延迟最低并且丢包率最少的节点进行连接.如 ...
- wegame服务器维护启动游戏失败,wegame连接服务器失败
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. wegame连接服务器失败的解决方法是: 1.按下键盘上的Win+R键,呼出运行菜单,在运行菜单中输入"CMD" ...
- VMware View Client 连接服务器,提示身份验证失败,连接服务器时
第一次安装或则重装系统后安装VMware View的时候 点击下一步 然后连接服务器地址 例如:192.168.xx.xxx,点击连接后,在输入账号的时候弹出VMware View Client ...
- 华为服务器文件升级失败,升级连接服务器失败
升级连接服务器失败 内容精选 换一换 2020年7月以及之后购买的实例,Kafka服务器允许客户端单IP连接的个数为1000个,在此之前购买的实例,Kafka服务器允许客户端单IP连接的个数为200个 ...
- 使用telnet命令,报错:无法打开主机的连接在端口23连接失败
1.页面载入出错时,查找问题的方法 当访问某个页面时,出现如下情况: 遇到以上情况,可以先通过以下的方式确认网络是否连接上 (1)打开cmd,输入命令:ping <ip> (2)打开cmd ...
最新文章
- python行与行之间必须对齐_Python行和缩进
- beego + nginx 实现反向代理统一认证
- 友情链接优化的技巧分享
- 学生成绩管理系统数据库设计
- 2017年实时更新系统hosts文件(不能访问时才会更新)不要用于非法行为 只供内部测试...
- 机器学习算法与Python实践之(二)k近邻(KNN)
- PHP日期、时间戳相关的小程序
- 卧槽,又来一个Windows神器!!!
- 原创 | 2020年Java程序员应该学习的10大技术
- 爬虫-请求图片并打开显示图片
- SWAT 学习相关基础知识(一)---Mr.Zhang
- 数据结构练习(08)链表中倒数第k个结点
- 《未来简史》读书笔记
- Ego的MyBatis框架笔记
- 阿里云服务器到底有什么好处?
- [4.2]-AutoSAR零基础学习-XCP 测量/校准 <<2>>
- 滴滴校招面经(已拿offer)
- Civilization V and Beyond Earth
- React中实现keepalive组件缓存效果
- 计算机考研考线代和概率论吗,考研数一数二数三的区别有哪些
热门文章
- Tableau——备注
- flutter: The method ‘DioHttpHeaders.add‘ has fewer named arguments thanthose of overridden ....
- java中最大最小值
- javascript typeof 和 instanceof 的区别和联系
- C#方法参数传递及方法重载
- wowza配置rtsp/rtp播放
- Android 属性动画 常用方法 与 插值器 Interpolator
- 低功耗实例——isolation cell及level shifter的选择
- 12.测试字体的练习
- (五)Excel函数应用之查询与引用函数