• WebSocket心跳


    为什么要实现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)
      }
    }
    

      

  • 相关阅读:
    Redis学习笔记(三)redis 的键管理
    Redis 学习笔记(四)RDB 和 AOF 持久化机制
    Solon Web 开发,八、校验、及定制与扩展
    Solon Web 开发,十二、统一的渲染控制
    Solon Web 开发,十一、国际化
    Solon Web 开发,十三、WebSocket
    Solon Web 开发,十、签权
    Solon Web 开发,九、跨域处理
    Solon Web 开发,六、过滤器、处理、拦截器
    Solon Web 开发,七、视图模板与Mvc注解
  • 原文地址:https://www.cnblogs.com/zhenjianyu/p/12964955.html
Copyright © 2020-2023  润新知