博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js websocket 心跳检测,断开重连,超时重连
阅读量:4595 次
发布时间:2019-06-09

本文共 2800 字,大约阅读时间需要 9 分钟。

1 function longSock(url, fn, intro = '') { 2   let lockReconnect = false //避免重复连接 3   let timeoutFlag = true 4   let timeoutSet = null 5   let reconectNum = 0 6   const timeout = 30000 //超时重连间隔 7   let ws 8   function reconnect() { 9     if (lockReconnect) return10     lockReconnect = true11     //没连接上会一直重连,设置延迟避免请求过多12     if (reconectNum < 3) {13       setTimeout(function() {14         timeoutFlag = true15         createWebSocket()16         console.info(`${intro}正在重连第${reconectNum + 1}次`)17         reconectNum++18         lockReconnect = false19       }, 5000) //这里设置重连间隔(ms)20     }21   }22   //心跳检测23   const heartCheck = {24     timeout: 5000, //毫秒25     timeoutObj: null,26     serverTimeoutObj: null,27     reset: function() {28       clearInterval(this.timeoutObj)29       clearTimeout(this.serverTimeoutObj)30       return this31     },32     start: function() {33       const self = this34       let count = 035       this.timeoutObj = setInterval(() => {36         if (count < 3) {37           if (ws.readyState === 1) {38             ws.send('HeartBeat')39             console.info(`${intro}HeartBeat第${count + 1}次`)40           }41           count++42         } else {43           clearInterval(this.timeoutObj)44           count = 045           if (ws.readyState === 0 && ws.readyState === 1) {46             ws.close()47           }48         }49       }, self.timeout)50     }51   }52   const createWebSocket = () => {53     console.info(`${intro}创建11`)54     timeoutSet = setTimeout(() => {55       if (timeoutFlag && reconectNum < 3) {56         console.info(`${intro}重连22`)57         reconectNum++58         createWebSocket()59       }60     }, timeout)61     ws = new WebSocket(url)62 63     ws.onopen = () => {64       reconectNum = 065       timeoutFlag = false66       clearTimeout(timeoutSet)67       heartCheck.reset().start()68     }69     ws.onmessage = evt => {70       heartCheck.reset().start()71       // console.info(evt);72       if(evt.data === 'HeartBeat') return73       fn(evt, ws)74     }75     ws.onclose = e => {76       console.info(`${intro}关闭11`, e.code)77       if (e.code !== 1000) {78         timeoutFlag = false79         clearTimeout(timeoutSet)80         reconnect()81       } else {82         clearInterval(heartCheck.timeoutObj)83         clearTimeout(heartCheck.serverTimeoutObj)84       }85     }86     ws.onerror = function() {87       console.info(`${intro}错误11`)88       reconnect() //重连89     }90   }91   createWebSocket()92   return ws93 }94 export default longSock
1  //方法调用 2 const handler = (evt, ws) => { 3    //evt 是 websockett数据 4    //ws 是请求名称,方便关闭websocket         5  } 6  7  const wssCenter = createSocket(`wss://url`, handler, '接待中心-小卡片') 8  9 10 11 wssCenter.close();  //断开连接

 

转载于:https://www.cnblogs.com/taxi/p/11199482.html

你可能感兴趣的文章
SqlSerch 查找不到数据
查看>>
集合相关概念
查看>>
Memcache 统计分析!
查看>>
(Python第四天)字符串
查看>>
个人介绍
查看>>
使用python动态特性时,让pycharm自动补全
查看>>
关于R软件的安装
查看>>
MySQL数据库免安装版配置
查看>>
你必知必会的SQL面试题
查看>>
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄
查看>>
Java性能总结四(转)
查看>>
net 程序员面试宝典
查看>>
2019年机器学习:追踪人工智能发展之路
查看>>