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

在我们近年来的前端开发中其实很频繁的使用这种数据更新模式。
只是对于前端来讲,初级前端开发在不更新技术的情况,很多人还是使用轮巡的方法去定时调用接口刷新数据。
而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判断。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容