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

vue3 webSocket 封装及使用

vue3 webSocket 封装及使用

封装

import { ref, onUnmounted } from 'vue';
interface SocketOptions {heartbeatInterval?: number;reconnectInterval?: number;maxReconnectAttempts?: number;
}class Socket {url: string;ws: WebSocket | null = null;opts: SocketOptions;reconnectAttempts: number = 0;listeners: { [key: string]: Function[] } = {};heartbeatInterval: number | null = null;constructor(url: string, opts: SocketOptions = {}) {this.url = url;this.opts = {heartbeatInterval: 30000, //心跳reconnectInterval: 5000, // 重连时间maxReconnectAttempts: 5, //重新连接次数...opts};this.init();}init() {this.ws = new WebSocket(this.url);this.ws.onopen = this.onOpen.bind(this);this.ws.onmessage = this.onMessage.bind(this);this.ws.onerror = this.onError.bind(this);this.ws.onclose = this.onClose.bind(this);}onOpen(event: Event) {console.log('WebSocket opened:', event);this.reconnectAttempts = 0;this.startHeartbeat();this.emit('open', event);}onMessage(event: MessageEvent) {console.log('WebSocket message received:', event.data);this.emit('message', event.data);}onError(event: Event) {console.error('WebSocket error:', event);this.emit('error', event);}onClose(event: CloseEvent) {console.log('WebSocket closed:', event);this.stopHeartbeat();this.emit('close', event);if (this.reconnectAttempts < this.opts.maxReconnectAttempts!) {setTimeout(() => {this.reconnectAttempts++;this.init();}, this.opts.reconnectInterval);}}startHeartbeat() {if (!this.opts.heartbeatInterval) return;this.heartbeatInterval = window.setInterval(() => {if (this.ws?.readyState === WebSocket.OPEN) {this.ws.send('ping');}}, this.opts.heartbeatInterval);}stopHeartbeat() {if (this.heartbeatInterval) {clearInterval(this.heartbeatInterval);this.heartbeatInterval = null;}}send(data: string) {console.error('给socket发送消息============>',data)if (this.ws?.readyState === WebSocket.OPEN) {this.ws.send(data);} else {console.error('WebSocket is not open. Cannot send:', data);}}on(event: string, callback: Function) {if (!this.listeners[event]) {this.listeners[event] = [];}this.listeners[event].push(callback);}off(event: string) {if (this.listeners[event]) {delete this.listeners[event];}}emit(event: string, data: any) {this.listeners[event]?.forEach(callback => callback(data));}
}export function useSocket(url: string, opts?: SocketOptions) {const socket = new Socket(url, opts);onUnmounted(() => {socket.off('open');socket.off('message');socket.off('error');socket.off('close');});return {socket,send: socket.send.bind(socket),on: socket.on.bind(socket),off: socket.off.bind(socket)};
}

使用


import {useSocket} from './useSocket'
/*** useSocket String 第一个参数 socket地址* 第二个参数 Object heartbeatInterval:心跳;reconnectInterval:重连间隔时间;maxReconnectAttempts:最大重连次数*/
const {socket, send, on, off} = useSocket('ws://127.0.0.1:5000',{});

相关文章:

vue3 webSocket 封装及使用

vue3 webSocket 封装及使用 封装 import { ref, onUnmounted } from vue; interface SocketOptions {heartbeatInterval?: number;reconnectInterval?: number;maxReconnectAttempts?: number; }class Socket {url: string;ws: WebSocket | null null;opts: SocketOption…...

记录vscode常用插件集合(extensions)

名称用处Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code适用于 VS Code 的中文&#xff08;简体&#xff09;语言包Dev ContainersVisual Studio代码开发容器ES7 React/Redux/GraphQL/React-Native snippetsES7 React/Redux/GraphQL/Rect Native代码段…...

正则表达式详解

一、正则表达式概述 正则表达式是一组由字母和符号组成的特殊文本&#xff0c;它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口&a…...

【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-两数之和绝对值最小【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入输出示例一输入输出说明 解题思路代码解法一pythonjavacpp 解法二pythonjavacpp 时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个整数数组nums&#xff0c;请你在该数组中找出两个数&#xff0c…...

expect脚本在自动化部署中的具体应用案例

#expect脚本在自动化部署中的具体应用 expect脚本是一个非常好的交互式应用脚本&#xff0c;在自动化部署中&#xff0c;可以使用这个脚本来实现全自动的自动化部署。下面是一些具体的应用案例。 场景一&#xff1a;自动安装mysql 可以使用expect脚本来实现mysql自动安装&…...

【Java+SQL Server】前后端连接小白教程

目录 &#x1f4cb; 流程总览 ⛳️【SQL Server】数据库操作 1. 新建数据库text 2. 新建表 3. 编辑表 ⛳️【IntelliJ IDEA】操作 1. 导入jar包 2. 运行显示错误 &#x1f4cb; 流程总览 ⛳️【SQL Server】数据库操作 打开SQL Server数据库-->sa登录-->新建数据库…...

Xilinx Zynq-7000系列FPGA多路视频处理:图像缩放+视频拼接显示,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解HLS 图像缩放介绍Video Mixer介绍 4、vivado工程介绍PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他…...

Web语言基础课程期末代做

《Web语言基础》课程期末考核要求综合运用课程所学知识&#xff0c;使用VS和SQL及相关开发工具&#xff0c;结合DIVCSS等前端设计技术&#xff0c;完成一个具备新闻发布和考试功能的动态系统&#xff0c;要求包括但不限于&#xff1a;用户注册、登录功能、新闻展示功能、后台数…...

Scanner常用知识点

在Java中&#xff0c;Scanner类是用于读取用户输入的工具类&#xff0c;可以从多种输入源读取数据&#xff0c;如标准输入流、文件或字符串。以下是一些Scanner类的常用知识点&#xff1a; Scanner的初始化&#xff1a;在使用Scanner类之前&#xff0c;需要先将其导入到你的Ja…...

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先&#xff0c;uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的&#xff0c;在官方提供的案例当中&#xff0c;核心代码是这一部分&#xff1a; 但如果将其封装为组件&#xff0c;并在一个页面当中引用多次来生成多个charts图标&#xff0c;那么这个时…...

PHP连接数据库 错误抑制 三元运算符 学习资料

PHP连接数据库 PHP可以通过不同的扩展和库来连接各种类型的数据库。下面是一个使用MySQL数据库的连接示例&#xff1a; <?php $servername "localhost"; $username "your_username"; $password "your_password"; $dbname "your_d…...

5G智慧工地整体解决方案:文件全文115页,附下载

关键词&#xff1a;5G智慧工地&#xff0c;智慧工地建设方案&#xff0c;智慧工地管理平台系统&#xff0c;智慧工地建设调研报告&#xff0c;智慧工地云平台建设 一、5G智慧工地建设背景 5G智慧工地是利用5G技术、物联网、大数据、云计算、AI等信息技术&#xff0c;围绕“人…...

数据结构 / 内存的动态申请和释放

1.内存的动态申请 malloc malloc 的头文件: #include <stdlib.h>格式: void *malloc(size_t size);参数: size_t size: 申请堆区内存大小, 单位是字节&#xff1b;size_t: 是数据类型, 是 unsigned long的宏定义的别名;返回值: void *: 通用类型指针,使用时需要强转为具…...

Android手电筒、闪光灯、torch、flash

1. 仅开启手电筒 单纯的开启手电筒我们可以使用CameraManager的.setTorchMode()方法。 cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)获取该相机特征是否可获取闪光灯。 CameraManager cameraManager (CameraManager) getSystemService(CAMERA_SE…...

C语言--每日选择题--Day26

第一题 1.在C语言中&#xff0c;表示一次性地给数组a的10元素赋值&#xff08;&#xff09; int a[10];scanf&#xff08;"%d"&#xff0c;a&#xff09;; A&#xff1a;正确 B&#xff1a;错误 答案及解析 B 我们知道单独的数组名就是首元素地址&#xff0c;但是也有…...

[ACTF2020 新生赛]BackupFile

打开题目就一句话&#xff1a;尝试找到源文件 和上一题一样&#xff0c;用dirsearch扫描网站找到了一下内容 flag.php&#xff0c;0B&#xff0c;虚假flag 瞅一眼index.php.bak是啥 下载了一个文件&#xff0c;把bak后缀删掉&#xff0c;打开了index.php源码 is_numeric()&am…...

WPF面试题:WPF绘图技术介绍

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位置使用圆角矩形画刷1. SolidColor…...

三、Lua变量

文章目录 一、变量分类二、变量赋值三、索引 一、变量分类 lua变量分为全局变量&#xff0c;局部变量。 全局变量&#xff1a;默认&#xff0c;全局有效。 局部变量&#xff1a;从作用范围开始到作用范围结束&#xff0c;需加local 修饰。 a1function ff()local b1 endprint(a…...

C#每天复习一个重要小知识day4:枚举的概念/申明/使用

目录 1.枚举的概念&#xff1a; 2.申明枚举和申明枚举变量&#xff1a; 申明枚举语法&#xff1a; 申明枚举变量语法&#xff1a; 1.枚举的概念&#xff1a; 枚举是什么&#xff1f;枚举是一个比较特别的存在&#xff0c;它是一个命名的整形常量的集合&#xff0c;一般用它…...

C++:对象模型和this指针

对象模型&#xff1a; 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间&#xff1a; 1字节 C编译器会给每个空对象也分配一个字节空间&#xff0c;是为了区分空对象占内存的位置 每个…...

告别繁琐配置:YuukiPS Launcher如何让动漫游戏管理变得简单高效

告别繁琐配置&#xff1a;YuukiPS Launcher如何让动漫游戏管理变得简单高效 【免费下载链接】Launcher-PC 项目地址: https://gitcode.com/gh_mirrors/la/Launcher-PC 你是否曾为管理多个游戏版本而头疼&#xff1f;每次切换服务器都需要重新配置代理&#xff0c;不同账…...

响应式导航栏汉堡菜单点击后下拉菜单不显示的解决方案

本文详解响应式导航栏中汉堡图标&#xff08;hamburger&#xff09;点击后菜单不展开的常见原因及修复方法&#xff0c;核心在于 CSS 选择器优先级与元素显隐逻辑的匹配&#xff0c;通过添加 .navbar_nav.active .cat { display: block; } 即可精准控制移动端菜单项的可见性。 …...

人工智能之数字生命-自我的4层12模块

一、根判定层 生命周期与边界控制模块 管待机、运行、收束、停止、死亡退出、降级运行。 世界/场景/状态刷新模块 刷新对象、场景、关系、当前值,形成“本轮可判定世界”。 服务值/安全值差额评估模块 统一计算服务差额与安全差额,给后续判断提供标尺。 根需求生成模块 从…...

初学者必看!如何解决Java线程不安全问题

对于java初学者来说&#xff0c;应该听过Java线程不安全的问题&#xff1a;线程修改变量时&#xff0c;会将变量拷贝到本地内存&#xff0c;修改完成后&#xff0c;再写回主内存。这个过程中&#xff0c;如果多个线程同时访问并修改同一个数据&#xff0c;就会出现线程安全问题…...

OpenClaw与Hermes入门基础教程(非常详细),收藏这一篇就够了!

最近 Hermes Agent 很火&#xff0c;媒体、Reddit 上"I ditched OpenClaw for Hermes"的帖子接连不断&#xff0c;国内也有不少朋友在问同一个问题&#xff1a; 它们到底是同一类东西吗&#xff1f;Hermes 能直接替代 OpenClaw 吗&#xff1f; 这个问题正好点中了最…...

Unity手游开发:用Joystick Pack插件搞定移动端虚拟摇杆(附完整代码)

Unity手游开发&#xff1a;Joystick Pack插件深度优化与移动端实战指南 移动游戏的核心体验往往始于指尖与屏幕的第一次触碰。当玩家在拥挤的地铁上单手操作角色闪避子弹&#xff0c;或是在激烈的PVP对战中精准释放技能时&#xff0c;虚拟摇杆的响应速度和操作手感直接决定了游…...

2026年ReactNative热更新主流方案深度对比

React Native热更新方案对比&#xff1a;Shiply、CodePush、Expo、Pushy 与自建&#xff0c;谁才是最佳选择&#xff1f; 在移动应用迭代节奏不断加快的背景下&#xff0c;热更新已成为保障用户体验与业务敏捷的重要技术路径。React Native 的热更新可在不通过应用商店审核的情…...

如何利用over-golang与Protobuf实现高效序列化与RPC通信:完整指南

如何利用over-golang与Protobuf实现高效序列化与RPC通信&#xff1a;完整指南 【免费下载链接】over-golang Golang相关&#xff1a;[审稿进度80%]Go语法、Go并发思想、Go与web开发、Go微服务设施等 项目地址: https://gitcode.com/gh_mirrors/ov/over-golang 在现代软件…...

如何实现uWebSockets认证令牌刷新:自动与手动触发的终极指南

如何实现uWebSockets认证令牌刷新&#xff1a;自动与手动触发的终极指南 【免费下载链接】uWebSockets Simple, secure & standards compliant web server for the most demanding of applications 项目地址: https://gitcode.com/gh_mirrors/uw/uWebSockets uWebSo…...

RDM接收端避坑指南:从哑音状态处理到UID校验,我的调试血泪史

RDM接收端避坑指南&#xff1a;从哑音状态处理到UID校验&#xff0c;我的调试血泪史 灯光控制系统的开发者们&#xff0c;如果你正在为RDM协议接收端的稳定性头疼不已&#xff0c;这篇文章或许能帮你省下几周的通宵调试时间。在实际工程中&#xff0c;协议文档的"理想情况…...