首页 > 其他分享 >class类封装ws

class类封装ws

时间:2024-06-05 15:00:10浏览次数:26  
标签:重连 封装 string private callback ws null class

export interface WebsocketProps {
  url: string; // WebSocket 连接地址
  reconnectInterval?: number; // 重连间隔时间(毫秒)
  heartBeatInterval?: number; // 心跳间隔时间(毫秒)
  isHeartbeatEnabled?: boolean; // 是否开启心跳
  heartMessage?: string; // 心跳消息
  maxReconnectAttempts?: number; // 最大重连次数
}

export default class Websocket {
  url: string;
  reconnectInterval: number;
  heartBeatInterval: number;
  isHeartbeatEnabled: boolean;
  heartMessage: string;
  maxReconnectAttempts: number;
  private reconnectAttempts: number; // 当前重连尝试次数
  private ws: WebSocket | null; // WebSocket 对象
  private heartBeatTimer: NodeJS.Timeout | null; // 心跳定时器
  private reconnectTimer: NodeJS.Timeout | null; // 重连定时器
  callback: Function;

  constructor(
    {
      url,
      reconnectInterval = 5000, // 默认5秒
      heartBeatInterval = 10000, // 默认10秒
      isHeartbeatEnabled = true,
      heartMessage = "hello",
      maxReconnectAttempts = 5, // 默认5次
    }: WebsocketProps,
    callback: Function
  ) {
    this.url = url;
    this.reconnectInterval = reconnectInterval;
    this.heartBeatInterval = heartBeatInterval;
    this.isHeartbeatEnabled = isHeartbeatEnabled;
    this.heartMessage = heartMessage;
    this.maxReconnectAttempts = maxReconnectAttempts;
    this.reconnectAttempts = 0;
    this.ws = null;
    this.heartBeatTimer = null;
    this.reconnectTimer = null;
    this.connectWs();
    this.callback = callback;
  }

  // 连接 Websocket
  private connectWs() {
    this.closeWs();
    this.stopReconnectWs();
    this.stopHeartBeat();

    // 创建 WebSocket 对象
    this.ws = new WebSocket(this.url);

    // 打开
    this.ws.onopen = () => {
      this.reconnectAttempts = 0;
      this.isHeartbeatEnabled && this.startHeartBeat();
      this.callback("open", "连接成功");
    };

    // 消息
    this.ws.onmessage = (event: { data: string }) => {
      this.callback("message", event.data);
    };

    // 关闭
    this.ws.onclose = () => {
      this.stopHeartBeat();
      if (this.reconnectAttempts <= this.maxReconnectAttempts) {
        this.reconnectTimer = setTimeout(() => {
          this.reconnectAttempts++;
          this.callback("close", `第 ${this.reconnectAttempts} 次尝试重连`);
          this.connectWs();
        }, this.reconnectInterval);
      } else {
        this.stopReconnectWs();
        this.callback("close", `已达到最大重连次数,停止重连`);
      }
    };
  }

  // 发送消息
  public sendMessage(message: string) {
    if (this.ws?.readyState === WebSocket.OPEN) {
      this.ws.send(message);
    }
  }

  // 开启心跳
  private startHeartBeat = () => {
    this.heartBeatTimer = setInterval(() => {
      if (this.ws?.readyState === WebSocket.OPEN) {
        this.ws.send(this.heartMessage);
      }
    }, this.heartBeatInterval);
  };

  // 停止心跳
  private stopHeartBeat = () => {
    if (this.heartBeatTimer) {
      clearInterval(this.heartBeatTimer);
      this.heartBeatTimer = null;
    }
  };

  // 停止重连
  private stopReconnectWs = () => {
    if (this.reconnectTimer) {
      clearTimeout(this.reconnectTimer);
      this.reconnectTimer = null;
    }
  };

  // 关闭连接
  public closeWs = () => {
    if (this.ws) {
      this.ws.close();
      this.ws = null;
    }
  };
}

// 调用示例
const initWebsocket = () => {
  const ws = new Websocket(
    { url: "ws://127.0.0.1" },
    async (type: string, message: string) => {
      console.log(type);
      console.log(message);
    }
  );
  console.log(ws);
};

initWebsocket();

标签:重连,封装,string,private,callback,ws,null,class
From: https://www.cnblogs.com/wanglei1900/p/18233062

相关文章

  • python自动化测试框架,封装方法方式
    第一种:静态方法封装,接口调用入参定义一个(默认json),直接执行接口请求接口封装代码如下:classOrderTransactionService:@staticmethoddefgetComboProductList(body):url=http_host+'/service?serialize=7'headers={'Content-Type':'applic......
  • python 标准库 dataclasses 使用指南
    简单使用dataclasses可以用来快速的定义数据类,并能够简单明了的指明该类所具有的属性和类型,比如,要定义一个名为Person的类,常规的写法如下:classPerson:def__int__(self,id:int,first_name:str,last_name:str,eye_color:str):self.id=idse......
  • Windows下载安装RabbitMQ客户端(2024最新篇)
    文章目录RabbitMQ认知RabbitMQ下载RabbitMQ安装更多相关内容可查看RabbitMQ认知定义:RabbitMQ是一个消息中间件,它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里。RabbitMQ与快递站......
  • Windows.h 是什么?
    认识Windows.h在C++中,进行Windows开发通常使用的库是windows.h这是Windows平台特有的一个头文件,它包含了WindowsAPI(应用程序接口)的声明和定义,允许开发者编写与Windows操作系统交互的程序。windows.h是一个包含大量Windows平台特有的数据类型、宏、函数原型......
  • Windows11系统Pnrphc.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Pnrphc.dll文件(挑选合适的版本文件)把它放......
  • Gitlab Runner在Windows如何自动发布基于.NET Framework 4.8的传统ASP.NET Web应用程
    摘要软件流水线能把程序员从繁琐的发布工作中解脱出来,但是跑在WindowsIIS里的传统Web应用程序,用Docker的方式不是最方便的。本文详细描述如何用Windows的OpenSSHServer来上传网站后,用PowerShell创建和修改IIS的虚拟目录应用程序。一、自动打包传统ASP.NETWeb应用程序1、Gitl......
  • 从局域网 (LAN) 访问 WSL 2 分发版
    从局域网(LAN)访问WSL2分发版当使用WSL1分发版时,如果计算机设置为可供LAN访问,那么在WSL中运行的应用程序也可供在LAN中访问。这不是WSL2中的默认情况。WSL2有一个带有其自己独一无二的IP地址的虚拟化以太网适配器。目前,若要启用此工作流,你需要执行与常规......
  • Windows平台如何修改监听的服务名称?
    这里介绍如何修改Windows平台监听的服务名称,至于需求背景介绍,这里就不做介绍了。存在既是合理。总有一些场景有这样的需求。那么如何修改Windows的监听名呢?修改过程中有什么影响呢?影响介绍:修改监听的服务名称,需要停止Oracle的监听服务,可能对业务有短暂的影响。这段时间新的会话......
  • 使用yolov10源码对图片进行目标检测的步骤讲解(windows环境、PyCharm软件、预测阶段)
            本文只讲解yolov10的预测阶段,即如何使用代码调用yolov10模型,对图片进行目标检测,并不涉及训练、验证等阶段。步骤:一、下载yolov10源码        1、打开源码地址。yolov10源码链接:https://github.com/THU-MIG/yolov10    注意:如果网页加载不......
  • class AB
    判断零极点的方法:如果将前级等效成戴维南等效电路,如果RC串联从中间输出,则存在一个极点,如果RC串联从R输出,则存在一个零点;如果将前级等效成诺顿等效电路,如果RC并联输出,则存在一个极点,如果某条并联支路存在RC串联,则引入一个零点;以上两种情况的零点一般都是RHZ,还有一种情况就是前节......