问题描述

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事件?相关推荐

  1. Datagridview代码设置选中行后,没有触发SelectionChanged事件

    不知道大家有没有遇到过这个问题,在winform开发软件的过程中,使用Datagridview代码设置选中行后,没有触发SelectionChanged事件,但是通过界面点击单元格或者选中行却是可以触 ...

  2. 用户端无法连接 WebSocket connection to ‘ws://xxxx.xx.com:2345/‘ failed:Error in connection establish

    1.确认访问地址 访问的地址不能是服务器的域名,需要真实的服务器ip 看看官网文档: 2.关闭linux防火墙 systemctl stop firewalld.service 3.服务器上开放端口 ...

  3. 服务器连接失败 请修复后重试,守望先锋无法连接服务器...正在重试连接修复方法...

    守望先锋无法连接服务器...正在重试连接修复方法 守望先锋正式开启内测,想必很多小伙伴都已经体验过了,但是也有很多朋友发现守望先锋无法连接服务器,显示正在重试的问题,那么下面小编就为大家介绍解决这方面 ...

  4. 实践案例丨Pt-osc工具连接rds for mysql 数据库失败

    本文分享自华为云社区<Pt-osc工具连接rds for mysql 数据库失败>,原文作者:云技术搬运工 . [现象] 主机可以telent 通rds 端口,并且使用mysql-clie ...

  5. websocket握手失败_WebSocket握手期间出错:意外的响应代码:500

    WebSocket握手期间出错:意外的响应代码:500 我在我的网站上使用websocket,但随机发送给我以下错误消息: WebSocket连接到'ws://client.mydomain.com/ ...

  6. 服务器网口显示感叹号,业务服务器或更新服务器连接失败(认证失败,黄色感叹号)怎么回事?...

    问题截图如下: 造成此问题原因有如下几种: 1.当前连接的节点服务器与网吧当前网络之间延迟过高或丢包率较高,造成间接性认证失败,可在接入节点中点击测试按钮,选择延迟最低并且丢包率最少的节点进行连接.如 ...

  7. wegame服务器维护启动游戏失败,wegame连接服务器失败

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. wegame连接服务器失败的解决方法是: 1.按下键盘上的Win+R键,呼出运行菜单,在运行菜单中输入"CMD" ...

  8. VMware View Client 连接服务器,提示身份验证失败,连接服务器时

    第一次安装或则重装系统后安装VMware View的时候  点击下一步 然后连接服务器地址  例如:192.168.xx.xxx,点击连接后,在输入账号的时候弹出VMware View Client ...

  9. 华为服务器文件升级失败,升级连接服务器失败

    升级连接服务器失败 内容精选 换一换 2020年7月以及之后购买的实例,Kafka服务器允许客户端单IP连接的个数为1000个,在此之前购买的实例,Kafka服务器允许客户端单IP连接的个数为200个 ...

  10. 使用telnet命令,报错:无法打开主机的连接在端口23连接失败

    1.页面载入出错时,查找问题的方法 当访问某个页面时,出现如下情况: 遇到以上情况,可以先通过以下的方式确认网络是否连接上 (1)打开cmd,输入命令:ping <ip> (2)打开cmd ...

最新文章

  1. python行与行之间必须对齐_Python行和缩进
  2. beego + nginx 实现反向代理统一认证
  3. 友情链接优化的技巧分享
  4. 学生成绩管理系统数据库设计
  5. 2017年实时更新系统hosts文件(不能访问时才会更新)不要用于非法行为 只供内部测试...
  6. 机器学习算法与Python实践之(二)k近邻(KNN)
  7. PHP日期、时间戳相关的小程序
  8. 卧槽,又来一个Windows神器!!!
  9. 原创 | 2020年Java程序员应该学习的10大技术
  10. 爬虫-请求图片并打开显示图片
  11. SWAT 学习相关基础知识(一)---Mr.Zhang
  12. 数据结构练习(08)链表中倒数第k个结点
  13. 《未来简史》读书笔记
  14. Ego的MyBatis框架笔记
  15. 阿里云服务器到底有什么好处?
  16. [4.2]-AutoSAR零基础学习-XCP 测量/校准 <<2>>
  17. 滴滴校招面经(已拿offer)
  18. Civilization V and Beyond Earth
  19. React中实现keepalive组件缓存效果
  20. 计算机考研考线代和概率论吗,考研数一数二数三的区别有哪些

热门文章

  1. Tableau——备注
  2. flutter: The method ‘DioHttpHeaders.add‘ has fewer named arguments thanthose of overridden ....
  3. java中最大最小值
  4. javascript typeof 和 instanceof 的区别和联系
  5. C#方法参数传递及方法重载
  6. wowza配置rtsp/rtp播放
  7. Android 属性动画 常用方法 与 插值器 Interpolator
  8. 低功耗实例——isolation cell及level shifter的选择
  9. 12.测试字体的练习
  10. (五)Excel函数应用之查询与引用函数