当前位置: 首页 > article >正文

封装websocket并在vuejs中调用

1、创建JS文件ce-websocket-util.js

class CeWebsocketUtil {
  websocket = null;
  reConnectTimes = 0; // 失败后重新连接次数
  wsInterVal = null; // 重新连接定时器
  maxReConnectTimes = 10; // 最大连接次数,默认10次
  reIntervalTime = 60 * 1000; // 重连间隔时间,默认1min
  currentComponent = null; // 当前调用的组件
  /**
   * 初始化Websocket数据
   * @param {*} _this  当前this
   * @param {*} url ws连接url
   * @param {*} option,配置,传null时,默认 maxReConnectTimes = 10, reIntervalTime = 60000
   */
  async initWebsocketData (_this, url, option) {
    this.currentComponent = _this;
    if (option && option.maxReConnectTimes) this.maxReConnectTimes = option.maxReConnectTimes;
    if (option && option.reIntervalTime) this.reIntervalTime = option.reIntervalTime;
    // 如果websocket不存在,则创建;存在的话,先关闭再创建
    if (!this.websocket) return this.createWebsocket(url);
    await this.closeWebsocket();
    this.createWebsocket(url);
  }

  // 创建Websocket连接
  createWebsocket (url) {
    this.websocket = new WebSocket(url);
    this.websocket.onopen = () => {
      this.onOpen();
    };
    this.websocket.onmessage = e => {
      this.onMessage(e);
    };
    this.websocket.onerror = () => {
      this.onError();
    };
    this.websocket.onclose = () => {
      this.onClose();
    };
  }

  /*
   * 连接成功
   */
  onOpen () {
    const NowFormatter = this.formatDateTime();
    if (this.reConnectTimes > 0) {
      console.info(`ws重连:第【${this.reConnectTimes}】次连接成功!****${this.websocket.url}****${NowFormatter}`);
    } else {
      console.info(`ws连接成功****${this.websocket.url}****${NowFormatter}`);
      this.reConnectTimes = 0;
    }
    // 注册onWsOpen方法
    this.currentComponent.onWsOpen();
  }

  /**
   * 收到消息
   * @param {*} e 消息事件
   */
  onMessage (e) {
    console.info(`ws收到消息****${this.websocket.url}****${e.data}`);
    // 注册onWsMessage方法,接收消息
    this.currentComponent.onWsMessage(e.data);
  }

  /**
   * 连接失败
   * @returns
   */
  onError () {
    const NowFormatter = this.formatDateTime();
    console.error(`ws连接失败****${this.websocket.url}****${NowFormatter}`);
    if (!this.wsInterVal) {
      this.setWsInterval();
      return;
    }
    // 超过最大连接次数后,不再连接
    if (this.reConnectTimes >= this.maxReConnectTimes) {
      console.error(`ws重连第【${this.reConnectTimes}】次失败,不再连接:****${this.websocket.url}****${NowFormatter}`);
      this.clearWsInterval();
    }
  }


  /**
   * 设置定时器
   */
  setWsInterval () {
    console.info('设置定时器');
    this.reConnect();
    this.wsInterVal = setInterval(() => {
      this.reConnect();
    }, this.reIntervalTime);
  }

  /**
   * 重新连接
   */
  reConnect () {
    // 先关掉 再连接
    this.websocket && this.websocket.close();
    const NowFormatter = this.formatDateTime();
    this.reConnectTimes += 1;
    console.info(`ws重连:正在尝试第【${this.reConnectTimes}】次连接:****${this.websocket.url}****${NowFormatter}`);
    this.initWebsocket(this.currentComponent, this.websocket.url);
  }

  /**
   * 清除定时器
   */
  clearWsInterval () {
    console.info('清除定时器');
    clearInterval(this.wsInterVal);
    this.wsInterVal = null;
  }

  /**
   * 关闭连接
   */
  closeWebsocket () {
    console.info('关闭websocket');
    this.websocket && this.websocket.close();
    this.websocket = null;
    this.reConnectTimes = 0;
    this.clearWsInterval();
  }

  // 关闭连接
  onClose () {
    const NowFormatter = this.formatDateTime();
    console.error(`ws断开连接****${NowFormatter}`);
  }

  /**
   * 发送心跳
   * @param {*} data
   */
  sendHeartBeat (data) {
    if (this.websocket) {
      console.info(`sendHeartBeat${JSON.stringify(data)}`);
      this.websocket.send(JSON.stringify(data));
    }
  }

  /**
   * 格式化new Date() YYYY-MM-DD HH:mm:ss:ms
   * 控制台打印websocket信息时使用,
   * @returns
   */
  formatDateTime () {
    const Now = new Date();
    return `${Now.getFullYear()}-${Now.getMonth() + 1}-${Now.getDate()} ${Now.getHours()}:${Now.getMinutes()}:${Now.getSeconds()}:${Now.getMilliseconds()}`;
  }
}
export default new CeWebsocketUtil();

2、VUE组件中
2.1 引入封装好的websocket

import CeWebsocketUtil from 'common/ce-websocket-util';

2.2、创建连接,初始化数据

CeWebsocketUtil.initWebsocketData(this, URL);

2.3、 websocket 连接成功

onWsOpen () {
 	console.log('websocket已连接成功');
},

2.4、发送心跳

CeWebsocketUtil.sendHeartBeat({ rule: "hello world" });

2.5、 接收websocket数据

onWsMessage (e) {
    // TODO
}

2.6、主动关闭websocket

CeWebsocketUtil.closeWebsocket();

http://www.kler.cn/news/148865.html

相关文章:

  • 动态库与静态库
  • Python与设计模式--设计原则
  • 九、LuaTable(表)
  • Nginx访问控制
  • 力扣142. 环形链表 II
  • 面试问题--智能指针
  • linux网络编程之UDP编程
  • 详细讲解1.js处理日期对象输出标准的“2000年12月22日 周三“ 的格式
  • 杂记 | 使用Docker安装并配置MongoDB以支持事务(单副本,并解决了证书文件错误的问题)
  • centos7.9 + gitlab12.3.0安装
  • PyQt6 QLineEdit单行文本框控件
  • 使用python提取出身份证的出生日期(18位和15位)
  • C# freesql技术 常用的增删改查sql命令
  • linux安装终端连接工具Tabby
  • DjiTello + YoloV5的无人机的抽烟检测
  • 创建Dataloader基础篇【一】
  • 拆解按摩器:有意思的按键与LED控制电路,学习借鉴一下!
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 9》(13)
  • IELTS学习笔记_grammar_新东方
  • 基于MBC调制方法的准Z源三相逆变器Simulink建模与仿真
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】特征点检测与匹配
  • MySQL慢查询
  • Flink Flink中的合流
  • Python---lambda表达式
  • 交换机的VRRP主备配置例子
  • 计网Lesson3 - 计算机网络评价指标与封包解包
  • 别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解
  • 基于C#实现Kruskal算法
  • DGL在异构图上的GraphConv模块
  • 【Redisson】基于自定义注解的Redisson分布式锁实现