Websocket 封装

export class WebSocketClass {
  /**
   * @description: 初始化实例属性,保存参数
   * @param {String} url ws的接口
   * @param {Function} msgCallback 服务器信息的回调传数据给函数
   * @param {String} name 可选值 用于区分ws,用于debugger
   * @param {String} startWsAfter 启动之后要做的事情
   */

  constructor(url, msgCallback, name = 'default', startWsAfter) {
    this.url = url;
    this.msgCallback = msgCallback;
    this.name = name;
    this.ws = null; // websocket对象
    this.status = null; // websocket是否关闭
    this.startWsAfter = startWsAfter; // 启动之后要做的事情
    this.interval = true; // 函数节流标识符
  }
  /**
   * @description: 初始化 连接websocket或重连webSocket时调用
   * @param {*} 可选值 要传的数据
   */
  connect(data) {
    // 新建 WebSocket 实例
    this.ws = new WebSocket(this.url);
    this.ws.onopen = e => {
      // 连接ws成功回调
      this.status = 'open';
      console.log(`${this.name}连接成功`, e);

      // 触发更新
      return this.startWsAfter();

      //心跳检测
      // this.heartCheck();

      if (data !== undefined) {
        // 有要传的数据,就发给后端
        return this.ws.send(data);
      }
    };

    // 监听服务器端返回的信息
    this.ws.onmessage = e => {
      return this.msgCallback(e.data);
    };

    // ws关闭回调
    this.ws.onclose = e => {
      this.closeHandle(e); // 判断是否关闭
    };

    // ws出错回调
    this.ws.onerror = e => {
      this.closeHandle(e); // 判断是否关闭
    };
  }

  // 发送信息给服务器
  sendHandle(data) {
    return this.ws.send(data);
  }

  //节流
  throttle(fn, interval) {
    let last = 0;
    return function (...args) {
      let context = this;
      let now = +new Date();
      // 还没到时间
      if (now - last < interval) return;
      last = now;
      fn.apply(this, args);
    };
  }

  closeHandle(e = 'err') {
    // 因为webSocket并不稳定,规定只能手动关闭(调closeMyself方法),否则就重连
    if (this.status !== 'close') {
      console.log(this.name + '网络不稳定断开进行重连');
      if (!this.interval) {
        return;
      }
      this.interval = false;
      setTimeout(() => {
        this.connect();
        this.interval = true;
      }, 1000);
    }
  }

  // 手动关闭WebSocket
  closeWebsocket() {
    this.status = 'close';
    console.log(`手动关闭websocket`);
    return this.ws.close();
  }

  //心跳检测
  heartCheck = {
    timeout: 5000,
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function () {
      clearTimeout(this.timeoutObj);
      clearTimeout(this.serverTimeoutObj);
      return this;
    },
    start: function () {
      var self = this;
      this.timeoutObj && clearTimeout(this.timeoutObj);
      this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
      this.timeoutObj = setTimeout(function () {
        //这里发送一个心跳,后端收到后,返回一个心跳消息,
        //onmessage拿到返回的心跳就说明连接正常
        this.ws.send('HeartBeat');
        console.log('ping');
        self.serverTimeoutObj = setTimeout(function () {
          // 如果超过一定时间还没重置,说明后端主动断开了
          this.ws.closeWebsocket(); //如果onclose会执行reconnect,我们执行 websocket.close()就行了.如果直接执行 reconnect 会触发onclose导致重连两次
        }, self.timeout);
      }, this.timeout);
    },
  };
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ldz_miantiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值