码迷,mamicode.com
首页 > Web开发 > 详细

Vue中WebSocket加入心跳机制

时间:2020-11-18 13:26:21      阅读:31      评论:0      收藏:0      [点我收藏+]

标签:reconnect   cto   state   send   class   let   计时   开启   default   

<script>
import { collectService } from ‘@/services‘;

export default {
  prop: [‘formWhere‘],
  data() {
    return {
      dialogPop: false,
      isDisabled: true,
      webInfo: [],
      id: null,
      ws: null,//建立的连接
      lockReconnect: false,//是否真正建立连接
      timeout: 58*1000,//58秒一次心跳
      timeoutObj: null,//心跳心跳倒计时
      serverTimeoutObj: null,//心跳倒计时
      timeoutnum: null,//断开 重连倒计时
    }
  },
  created() {
    this.initWebpack();
  },
  methods: {
    initWebpack(){
      const wsurl=‘wss://XXXXXXX‘;//ws地址,这里加入自己的地址即可
      this.ws = new WebSocket(wsurl);
      this.ws.onopen = this.onopen;
      this.ws.onmessage = this.onmessage;
      this.ws.onclose = this.onclose;
      this.ws.onerror = this.onerror;
    },
    reconnect() {//重新连接
      var that = this;
      if(that.lockReconnect) {
        return;
      };
      that.lockReconnect = true;
      //没连接上会一直重连,设置延迟避免请求过多
      that.timeoutnum && clearTimeout(that.timeoutnum);
      that.timeoutnum = setTimeout(function () {
        //新连接
        that.initWebpack();
        that.lockReconnect = false;
      },5000);
    },
    reset(){//重置心跳
      var that = this;
      //清除时间
      clearTimeout(that.timeoutObj);
      clearTimeout(that.serverTimeoutObj);
      //重启心跳
      that.start();
    },
    start(){ //开启心跳
      console.log(‘开启心跳‘);
      var self = this;
      self.timeoutObj && clearTimeout(self.timeoutObj);
      self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
      self.timeoutObj = setTimeout(function(){
        //这里发送一个心跳,后端收到后,返回一个心跳消息,
        if (self.ws.readyState == 1) {//如果连接正常
          self.ws.send("heartCheck"); //这里可以自己跟后端约定
        }else{//否则重连
          self.reconnect();
        }
        self.serverTimeoutObj = setTimeout(function() {
          //超时关闭
          self.ws.close();
        }, self.timeout);
      }, self.timeout)
    }, 
   onopen() {
      console.log("open");
      //开启心跳
      this.start();
    },
    onmessage(e) {
      console.log(‘接收信息‘, e);
      console.log(‘接收信息‘, e.data);
      //下面这块代码,接收到后端返回的消息后,根据自己的需求去判断
      if(e.data == ‘heartCheck‘){
        // this.webInfo = ‘‘;
      }else {
        let data = JSON.parse(e.data);
        if(data && data.length > 0){
          let arr = [];
          data.forEach(element => {
            if(element.collectorId == localStorage.getItem(‘id‘)) {
              arr.push(element);
              return;
            }
          });
          this.webInfo = arr;
          console.log(‘this.webInfo--‘,this.webInfo);
        }
      }
      //收到服务器信息,心跳重置
      this.reset();
    },
    onclose(e) {
      console.log("连接关闭");
      console.log(‘websocket 断开: ‘ + e.code + ‘ ‘ + e.reason + ‘ ‘ + e.wasClean);
      //重连
      this.reconnect();
    },
    onerror(e) {
      console.log("出现错误");
      //重连
      this.reconnect();
    },
    onsend(msg) {//向服务器发送信息
      //数据发送
      this.websock.send(msg);
    },
  },
}
</script>

这是本人最终用到的代码,新测真实有效

参考这篇文章

https://blog.csdn.net/kang19980516/article/details/104658081?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-104658081.nonecase&utm_term=vue%E4%B8%AD%20websocket%E5%BF%83%E8%B7%B3%E6%9C%BA%E5%88%B6&spm=1000.2123.3001.4430

Vue中WebSocket加入心跳机制

标签:reconnect   cto   state   send   class   let   计时   开启   default   

原文地址:https://www.cnblogs.com/tanweiwei/p/13969132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!