为什么要实现websocket心跳?
在使用原生websocket的时候,如果设备网络断开,不会触发任何函数,前端程序无法得知当前的连接已经断开.
这个时候如果调用 websocket.send()方法,浏览器就会发现消息发不出去,便会立刻或一定短时间后(不同浏览器或浏览器版本可能表现不同)触发onclose函数.
1.页面初始化调用initWebSocket函数,目的是创建一个websocket方法
var lockReconnect = false //避免重复连接
var wsUrl = 'ws://xxx.xx.xx'
var ws = null
var reconnectTimer = null
var reconnectDelayTime = 10000;//重复连接延迟时间,避免一直重复连接
var heartCheckIntervalTime = 30000;//心跳检测间隔时间
function initWebSocket(){
try{
ws = new WebSocket(wsUrl)
wsMonitor()
}catch(e){
console.log(e)
reconnect(wsUrl)
}
}
2.实现wsMonitor方法,该方法内把一些监听事件进行封装
function wsMonitor (){
ws.onclose = ()=>{
console.log('连接关闭')
reconnect(wsUrl)
}
ws.onerror = ()=>{
console.log('发生异常')
reconnect(wsUrl)
}
ws.onopen = ()=>{
console.log('连接打开')
heartCheck.start()
}
ws.onmessage = ()=>{
console.log('接收到消息')
heartCheck.start()
}
}
3.当网络断开,会先调用onerror,onclose事件可以监听到,会调用reconnect方法进行重连操作.
正常情况下是先调用onopen方法,接收到数据时会被onmessage事件坚挺到
4.重连操作reconnect方法实现
function reconnect(wsUrl){
if(lockReconnect){
return
}
lockReconnect = true;
reconnectTimer && clearTimeout(reconnectTimer)
reconnectTimer = setTimeout(()=>{
initWebSocket(wsUrl)
lockReconnect = false
},reconnectDelayTime)//设置延迟连接
}
5.实现心跳监测代码(个人理解:关键点在heartCheck.start方法;)
var heartCheck = {
timeout:heartCheckIntervalTime,
timeoutObj:null,
serverTimeoutObj:null,
start(){
this.timeoutObj && clearTimeout(this.timeoutObj)
this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj)
this.timeoutObj = setTimeout(()=>{
ws.send('Is Server Alive?')
this.serverTimeoutObj = setTimeout(()=>{
ws.close()
},this.timeout)
},this.timeout)
}
}