websocket 方法封装

export default class WS {constructor(listener) {this.keepAlive = 8000;  // 心跳检测保活时间this.dogFood = 0;       // 心跳检测标志位this.watchDog = -1;     // 心跳检测定时器this.timeout = -1;      // 连接超时定时器this.ws = null;this.url = null;this.listener = listener;this.onWebSocketOpen = this.onWebSocketOpen.bind(this);this.onWebSocketError = this.onWebSocketError.bind(this);this.onWebSocketClose = this.onWebSocketClose.bind(this);this.onWebSocketMessage = this.onWebSocketMessage.bind(this);}/*** 连接 WebSocket 服务器* @param {String} url 连接地址* @param {Number} timeout 超时时间*/connect(url, timeout = 3000) {this.disconnect();this.url = url;this.ws = new WebSocket(url);this.ws.addEventListener("open", this.onWebSocketOpen);this.ws.addEventListener("error", this.onWebSocketError);this.ws.addEventListener("close", this.onWebSocketClose);this.ws.addEventListener("message", this.onWebSocketMessage);this.timeout = setTimeout(() => {this.disconnect();this.onWebSocketTimeout();}, timeout);}/*** 断开 WebSocket 连接(设计原因,客户端主动关闭连接不派发 websocket:close 事件)* @param {Number} code 关闭代码(默认 1000 正常关闭)*/disconnect(code = 1000) {clearTimeout(this.timeout);clearInterval(this.watchDog);if (this.ws) {this.ws.removeEventListener("open", this.onWebSocketOpen);this.ws.removeEventListener("error", this.onWebSocketError);this.ws.removeEventListener("close", this.onWebSocketClose);this.ws.removeEventListener("message", this.onWebSocketMessage);this.ws.close(code);}}/*** 发送消息* @param {*} message 消息对象*/send(message) {if (this.ws?.readyState === WebSocket.OPEN) {this.ws.send(JSON.stringify(message));}}// 启动看门狗(心跳检测)startWatchDog() {this.send({ type: "ping" });this.watchDog = setInterval(() => {if (this.dogFood === 0) {clearInterval(this.watchDog);return this.onWebSocketTimeout();}this.dogFood = 0;this.send({ type: "ping" });}, this.keepAlive);}onWebSocketOpen(event) {console.log("WebSocket 连接成功!");clearTimeout(this.timeout);clearInterval(this.watchDog);this.startWatchDog(); // 开始心跳检测if (this.listener?.onOpen) {this.listener.onOpen(event);}}onWebSocketError(event) {console.log("WebSocket 发生错误", event);clearTimeout(this.timeout);clearInterval(this.watchDog);if (this.listener?.onError) {this.listener.onError(event);}}onWebSocketClose(event) {console.log("WebSocket 连接关闭", event);clearTimeout(this.timeout);clearInterval(this.watchDog);if (this.listener?.onClose) {this.listener.onClose(event);}}onWebSocketMessage(event) {this.dogFood = 1;if (this.listener?.onMessage) {this.listener.onMessage(JSON.parse(event.data));}}onWebSocketTimeout() {console.log("WebSocket 连接超时");if (this.listener?.onTimeout) {this.listener.onTimeout(this.ws);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-Python(21):OpenCV中的轮廓性质

3.轮廓的性质 本文我们将主要学习基于轮廓来提取一些经常使用的对象特征。 3.1 长宽比 边界矩形的宽高比: x,y,w,h cv2.boundingRect(cnt) aspect_ratio float(w)/h 3.2 Extent 轮廓面积与边界矩形面积的比。 area cv2.contourArea(cnt) x,y,w,h cv2.bounding…

自己动手写自旋锁

自旋锁以其高效闻名。顾名思义,自旋即如果无法成功锁住锁资源则会一直循环尝试锁,这与互斥锁的行为较为不同(互斥锁如果无法锁住则会挂起等待)。但其特性也决定了其使用场景,对于简单几步即可完成对共享资源操作的场景…

K8S Ingress-Nginx导出TCP端口

ingress-nginx导出TCP端口 Exposing TCP and UDP services - Ingress-Nginx Controllerhttps://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md helm upgrade ingress-nginx导出redis 6379端口(这种方式最简单&…

王道考研计算机网络——应用层

如何为用户提供服务? CS/P2P 提高域名解析的速度:local name server高速缓存:直接地址映射/低级的域名服务器的地址 本机也有告诉缓存:本机开机的时候从本地域名服务器当中下载域名和地址的对应数据库,放到本地的高…

C语言实现RSA算法加解密

使用c语言实现了RSA加解密算法,可以加解密文件和字符串。 rsa算法原理 选择两个大素数p和q;计算n p * q;计算φ(n)(p-1)(q-1);选择与φ(n)互素的整数d;由de1 mod φ(n)计算得到e;公钥是(e, n), 私钥是(d, n);假设明…

Microsoft .NET Framework 4.5.1 离线安装包

Microsoft .NET Framework 4.5.1 安装包: 一、离线安装包: 百度网盘 链接: https://pan.baidu.com/s/1IGEYT1vyruY6KFu6XEmerA 提取码: m6ix 离线安装包官方地址: https://www.microsoft.com/zh-cn/download/details.aspx?id40779 二、在…

如何在VSCode搭建ESP-IDF开发ESP32

文章目录 概要安装VScode安装ESP-IDF插件使用官方例程小结 概要 ESP-IDF(Espressif IoT Development Framework) 即乐鑫物联网开发框架,它基于 C/C 语言提供了一个自给自足的 SDK,可为在 Windows、Linux 和 macOS 系统平台上开发 ESP32 应用程序提供工具…

跳跃表原理及实现

一、跳表数据结构 跳表是有序表的一种,其底层是通过链表实现的。链表的特点是插入删除效率高,但是查找节点效率很低,最坏的时间复杂度是O(N),那么跳表就是解决这一痛点而生的。 为了提高查询效率,我们可以给链表加上索…

天翼云云间高速实现租户跨地域内网互通

一、业务需求 用户业务在襄阳、武汉两个云池部署,希望通过云间高速产品将两个资源池云内资源通过云内专网实现内网互通。要求内网双向互通。 二、测试环境配置 云池vpc名称vpc网段子网内网ip/gweip主机名互联网带宽襄阳ceshi192.168.0.0/16192.168.1.0/24192.168.…

Android studio socket客户端应用设计

一、XML布局设计: <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/r…

unity学习笔记----游戏练习02

一、阳光值的展示和消耗 1.创建一个文本组件用于显示阳光的数值&#xff0c;然后在脚本中得到这个UI。 在SunManger中得到这个组件的引用 public TextMeshProUGUI sunPointText; 写一个用于更新显示的方法 public void UpdataSunPointText() { sunPointText.tex…

FileZilla的使用主动模式与被动模式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、FileZilla简介 1、FileZilla是什么&#xff1f; 2、FileZilla的应用场景 二、FileZilla的安装 1、下…

JVM篇:JVM内存结构

程序计数器 程序计数器英文名叫&#xff1a;Program Counter Register 作用&#xff1a;用来记录下一条jvm指令的地址行号。 先来查看一段jvm指令&#xff0c;这些指令对应的java代码就是输出1-5 操作系统运行该Java程序时具体流程如下 语言解释&#xff1a;源文件通过编译转…

光伏逆变器MPPT的作用、原理及算法

MPPT是逆变器非常核心的技术&#xff0c;MPPT电压在进行光伏电站设计时一项非常关键的参数。 一、什么是MPPT&#xff1f; &#xff08;单块光伏组件的I-V、P-V曲线&#xff09; 上图中&#xff0c;光伏组件的输出电压和电流遵循I-V曲线(绿色)、P-V曲线(蓝色)&#xff0c;如果…

《C#程序设计教程》总复习

一、单项选择题 1.short 类型的变量在内存中占据的位数是 ( )。 A. 8 B. 16 C. 32 D. 64 2.对千 int[ 4,5]型的数组 a, 数组元素 a[2,3] 存在数组第 ( )个位置上。 A. 11 B. 12 C. 14 D. 15 3.设 int 类型变量 x,y,z 的值分别是2、3、6 , 那么…

NVMe over Fabrics:概念、应用和实现

对于大部分人来说&#xff0c;NVMe over Fabrics&#xff08;简称NVMf&#xff09;还是个新东西&#xff0c;因为其第一个正式版本的协议在今年6月份才发布。但是这并不影响人们对NVMf的关注&#xff0c;因为这项依托于NVMe的技术很可能继续改变存储市场格局。 NVMf的贡献在于…

labuladong日常刷题-双指针 | LeetCode 83删除排序链表中的重复元素 5最长回文子串

双指针操作链表与字符串 LeetCode 83 删除排序链表中的重复元素 2023.12.28 题目链接labuladong讲解[链接] ListNode* deleteDuplicates(ListNode* head) {/*暴力求解ListNode* cur new ListNode();ListNode* prenode cur;cur->next head;cur cur->next;while(cu…

web自动化(4)——POM设计重构

1. 什么是POM Page Object Model 是ui自动化测试中常见的封装方式。 原理&#xff1a;将页面封装为PO对象&#xff0c;然后通过面向对象的方式实现UI自动化 2. 封装原则 PO无需包含全部UI元素PO应当验证元素PO不应该包含断言PO不应该暴露元素 3. 怎么进行POM封装 面向对象…

2.5 C语言之类型转换

2.5 C语言之类型转换 一、类型转换 一、类型转换 当一个运算符的几个操作数类型不同时&#xff0c;就需要通过一些规则把它们转换为某种共同的类型。 一般来说&#xff0c;自动转换是指把“比较窄的”的操作数转换为“比较宽的”的操作数&#xff0c;并且不丢失信息的转换。例…

架构设计系列 5:常见架构介绍

前面讲了架构是什么&#xff0c;架构的发展史&#xff0c;架构设计的基础理论&#xff0c;这次针对常见架构设计风格进行介绍和分析。 一、MVC&#xff1a;三层架构经典 经典的 MVC 架构&#xff08;Model-View-Controller&#xff09;架构是软件系统架构设计中的经典&#xf…