美文网首页
创建webScoket连接及心跳检测及数据更新全套源码

创建webScoket连接及心跳检测及数据更新全套源码

作者: 呼小鹏 | 来源:发表于2021-03-22 13:36 被阅读0次

在我们近年来的前端开发中其实很频繁的使用这种数据更新模式。
只是对于前端来讲,初级前端开发在不更新技术的情况,很多人还是使用轮巡的方法去定时调用接口刷新数据。
而webScoket就是为了解决轮巡所产生的多种弊端而产生的。
下面就是本人使用webScoket的vue项目代码方案,也参考了其他代码进行优化完善。

  mounted() {
    this.newWebSocket()
    setTimeout(() => {
      this.loading = false
    }, 1000)
  },
  destroyed() {
    this.websocket && this.websocket.close()
  },

实现webSocket

    newWebSocket() {
      let _this = this
      // let currentIp = this.$axios.defaults.baseURL.split('http://').join('');    //这里是取的vue项目中IP配置地址
      // let currentIp = '192.168.1.251:8091'  
      var wsUrl = 'ws://' + currentIp + '/api/websocket/server';
      //判断当前浏览器是否支持WebSocket
      if ('WebSocket' in window) {
        this.websocket = new WebSocket(wsUrl);
      } else {
        this.$message.error('Not support websocket');
      };
      //连接发生错误的回调方法
      this.websocket.onerror = function () {
        console.log("出错");
        _this.reconnect(wsUrl);
      };
      //连接成功建立的回调方法
      this.websocket.onopen = function (event) {
        heartCheck.reset().start();      //心跳检测重置
        console.log("open");
      };
      //接收到消息的回调方法
      this.websocket.onmessage = function (event) {
        heartCheck.reset().start();
        // 这里是获取到数据后我们的操作行为,对应方法也就不需要写了,对照后台返回的数据格式进行操作,注意:心跳检测的时候,后台会返回我们定义好的文字(这里为ping),在我们接数据的时候需要考虑将此数据过滤掉。
        if (event.data && event.data !== 'onMessage->ping') {
           this.warningNotify(jsonObj.data.data)
          }
        }
      };
      //连接关闭的回调方法
      this.websocket.onclose = function () {
        console.log("close");
      };
      //心跳检测
      var heartCheck = {
        timeout: 50000,        //1分钟发一次心跳
        timeoutObj: null,
        serverTimeoutObj: null,
        reset: function () {
          clearTimeout(this.timeoutObj);
          clearTimeout(this.serverTimeoutObj);
          return this;
        },
        start: function () {
          var self = this;
          self.timeoutObj && clearTimeout(self.timeoutObj);
          self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
          self.timeoutObj = setTimeout(function () {
            //这里发送一个心跳,后端收到后,返回一个心跳消息,
            //readyState 拿到返回的心跳的状态readyState  1为正常
            _this.websocket.readyState == 1 && _this.websocket.send("ping");
            self.serverTimeoutObj = setTimeout(function () {//如果超过一定时间还没重置,说明后端主动断开了
              _this.websocket.close();     //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
            }, self.timeout)
          }, this.timeout)
        }
      }
    },
    sendMsg() {
      this.websocket && this.websocket.send('我的');
    },
    reconnect() {
      let lockReconnect = false
      if (lockReconnect) return;
      lockReconnect = true;
      setTimeout(() => {     //没连接上会一直重连,设置延迟避免请求过多
        this.newWebSocket();
        lockReconnect = false;
      }, 2000);
    }

对比网上的一些webScoket我进行了一些优化,优化点如下。
1.webScoket连接错误onerror的时候执行reconnect方法重连,但是关闭onclose的时候不进行重连。因为连接错误并断开会进入对应两个方法,如果两个方法都进行重连,当切换路由时是会触发onclose,会出现页面已经跳转,但还会重连webScoket的问题。
2.在_this.websocket.readyState == 1 && _this.websocket.send("ping")里,我将原本网上的_this.websocket && _this.websocket.send("ping")进行修改,因为当服务器端断开时,websocket其实还没有销毁,会导致报错WebSocket is already in CLOSING or CLOSED state.,所以直接修改用连接状态readyState判断。

相关文章

  • 创建webScoket连接及心跳检测及数据更新全套源码

    在我们近年来的前端开发中其实很频繁的使用这种数据更新模式。只是对于前端来讲,初级前端开发在不更新技术的情况,很多人...

  • ubuntu下安装

    安装PostgreSQL及相关依赖: 更改数据库连接认证 创建用户 sudo adduser www 创建日志目录...

  • Netty心跳检测代码实例及源码分析

    背景:今天在研读项目netty相关代码时,发现有设备有心跳机制(尽管在本项目中没啥左右),本着要不试一下的方式,调...

  • c++ opencv矩形检测

    1.源码实现 2.编译源码 3.原图及检测结果

  • Dubbo 长连接实现与配置

    初始连接:引用服务|增加提供者==>获取连接===》是否获取共享连接==>创建连接客户端==》开启心跳检测状态检查...

  • javascript的数组Array

    创建数组及修改 类型检测 转换方法 Array栈操作 Array队列操作 Array的反转和排序 数组的连接与截取...

  • 七夕节福利,一套java架构师资源等你拿

    精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频教程 java全套学习视频教程及源码...

  • JDBC原理

    JDBC接口及数据库厂商实现 工作原理 加载驱动,建立连接:DriverManager 创建语句对象:Statem...

  • sqlalchemy 初级使用 (小白)

    环境:python 2.7 1、引入数据库连接及创建session工厂。相应代码如下: import sys de...

  • PostgreSql连接池(psycopg2.pool)

    连接池的作用及原理 正常访问数据库的过程中,每次访问都需要创建数据库的连接,这会消耗大量的资源;连接池的就是为数据...

网友评论

      本文标题:创建webScoket连接及心跳检测及数据更新全套源码

      本文链接:https://www.haomeiwen.com/subject/fqdzcltx.html