WebSocket封装方案

ws.js

export default class WS {
  options = {};
  ws = null;
  heartBeatCount = 0;
  heartInterval = null;

  constructor({
    url,
    maxHeartCount = 3,
    loopCheckTime = 30000,
    initConnectCb,
    getMessageCb,
    errorCb,
    closeCb,
    heartInfo
  }) {
    this.options = {
      url,
      maxHeartCount,
      loopCheckTime,
      initConnectCb,
      getMessageCb,
      errorCb,
      closeCb,
      sso_session_id2: localStorage.getItem('sso_session_id2'),
      heartInfo: JSON.stringify(heartInfo)
    };
  }
  
  /**开启wbsocket */
  startWs() {
    if (this.ws) {
      return;
    }
    this.connect();
    this.errorHandle();
    this.getMessage();
    this.closeHandle();
  }

  /**
   * 手动关闭连接
   * */
  closeWs() {
    this.consoleLog('websocket----:手动关闭websocket');
    if (this.heartInterval) {
      clearInterval(this.heartInterval);
    }
    this.ws.close();
    this.ws = null;
  }

  /**
   * 连接websocket
   * */
  connect() {
    this.heartBeatCount = 0;
    this.ws = new WebSocket(`${this.options.url}`);
    this.ws.onopen = () => {
      this.consoleLog('websocket----:websocket建立连接');
      this.heartCheck();
      if (this.options.initConnectCb) {
        this.consoleLog('websocket----:初始化发送消息');
        this.options.initConnectCb();
      }
    };
  }

  /**
   * 开启检测
   * */
  heartCheck() {
    if (!this.options.heartInfo) return;

    let that = this;
    this.ws.send(this.options.heartInfo);
    this.heartInterval = setInterval(() => {
      this.consoleLog(this.ws.readyState);
      if (this.ws.readyState === 1) {
        this.heartBeatCount += 1;
        if (this.heartBeatCount <= this.options.maxHeartCount) {
          that.ws.send(that.options.heartInfo);
          this.consoleLog(`websocket----:第${this.heartBeatCount}次检测心跳`);
        } else {
          this.consoleLog(
            `websocket----:第${this.heartBeatCount}次检测心跳,心跳检测超出最大检测次数,启动重连程序`
          );
          this.reConnect();
        }
      } else {
        this.consoleLog(
          `websocket----:第${this.heartBeatCount}次检测心跳,连接建立失败,启动重连程序`
        );
        this.reConnect();
      }
    }, this.options.loopCheckTime);
  }

  /**
   * 获取消息
   * */
  getMessage() {
    this.ws.onmessage = (e) => {
      this.consoleLog('websocket----:接收到websocket的消息触发回调');
      if (e.data) {
        try {
          const data = JSON.parse(e.data);
          if (
            (data.header && data.header.type === 'HEART') ||
            data == this.options.heartInfo
          ) {
            this.consoleLog(
              'websocket----:接受心跳检测成功响应,心跳检测次数重置为0'
            );
            this.heartBeatCount = 0;
          } else {
            this.consoleLog('业务数据获取:', data);
            if (this.options.getMessageCb) {
              this.options.getMessageCb(data);
            }
          }
        } catch (e) {
          this.consoleLog(e);
        }
      }
    };
  }

  /**
   * 通信错误触发
   * */
  errorHandle() {
    this.ws.onerror = (e) => {
      this.consoleLog('websocket----:websocket通信发生错误触发回调:', e);
      if (this.options.errorCb) {
        this.options.errorCb(e);
      }
      this.reConnect();
    };
  }

  /**
   * 关闭时触发
   * */
  closeHandle() {
    this.ws.onclose = (e) => {
      this.consoleLog('websocket----:websocket关闭触发回调', e);

      if (this.options.closeCb) {
        this.options.closeCb(e);
      }
    };
  }

  /**
   * 启动重连程序
   * */
  reConnect() {
    this.consoleLog('websocket----:启动重新连接');
    if (this.heartInterval) {
      clearInterval(this.heartInterval);
    }
    this.closeWs();
    this.connect();
  }

  consoleLog() {
    // console.log(...arguments);
  }
}

use

import WS from "@/utils/ws";

const url = `ws://${ip}:12220/command/webSocket/${userId}`;
const ws = new WS({
  url,
  heartInfo: "heart",
  getMessageCb: (data) => {
    unread.value = data ? Number(data) : null;
  },
});
ws.startWs();

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SmartBoot是一个基于Java的轻量级开发框架,它集成了众多优秀的开源组件,包括Spring Boot,Netty等。而WebSocket是一种基于TCP协议的通信协议,它能够在客户端和服务器之间建立双向通信的连接。 在SmartBoot中,WebSocket提供了一种方便的方式来实现实时双向通信。通过使用SmartBoot WebSocket模块,我们可以轻松地搭建一个支持WebSocket协议的服务器。 SmartBoot WebSocket模块内部使用了Netty作为底层通信框架。Netty是一个高性能的网络编程框架,能够支持大量的并发连接。通过使用Netty,SmartBoot的WebSocket模块可以高效地处理来自客户端的WebSocket连接请求,并与客户端进行实时的数据交互。 对于开发者而言,使用SmartBoot WebSocket模块非常简单。只需在应用程序中引入相应的依赖,然后编写处理WebSocket连接和消息的逻辑即可。SmartBoot提供了一些方便的注解和接口,用于处理WebSocket连接的建立、关闭和消息的发送和接收。 使用SmartBoot WebSocket,开发者可以轻松地实现实时的推送功能,例如在线聊天、实时股票行情等。相比于传统的Ajax轮询方式,WebSocket能够更高效地实现实时通信,并且减少了不必要的服务器资源消耗。 总的来说,SmartBoot WebSocket是一个强大而方便的工具,可以帮助开发者快速实现基于WebSocket的实时通信功能。无论是构建在线聊天应用还是实时推送系统,SmartBoot WebSocket都能为开发者提供便捷的解决方案。 ### 回答2: SmartBoot是一个基于Netty开发的低延迟、高性能的Java NIO框架,它支持WebSocket协议。 WebSocket是一种全双工通信协议,它在客户端与服务器之间建立起一个持久连接,可以实时地双向通信。与传统的HTTP协议相比,WebSocket可以节省连接建立和关闭的开销,同时也减少了数据传输的字节量,降低了网络延迟。 SmartBoot通过内置的WebSocket模块,可以轻松地实现基于WebSocket的通信。开发者可以使用SmartBoot提供的WebSocket API,方便地编写业务逻辑,处理客户端和服务器之间的实时交互。 使用SmartBoot进行WebSocket开发,可以享受到其高性能和低延迟的优势。SmartBoot的NIO架构和优化算法可以提供快速的数据传输速度,从而可以满足实时通信的要求。 此外,SmartBoot提供了一些便捷的功能,比如自动解析和封装WebSocket帧,处理心跳检测等。开发者只需要专注于业务逻辑的实现,而无需关注底层网络通信的细节。 总之,通过SmartBoot可以轻松地实现基于WebSocket的实时通信,提供快速响应和高性能的网络应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值