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 的中文(简体)语言包Dev ContainersVisual Studio代码开发容器ES7 React/Redux/GraphQL/React-Native snippetsES7 React/Redux/GraphQL/Rect Native代码段…...
正则表达式详解
一、正则表达式概述 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口&a…...
【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-两数之和绝对值最小【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入输出示例一输入输出说明 解题思路代码解法一pythonjavacpp 解法二pythonjavacpp 时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个整数数组nums,请你在该数组中找出两个数,…...
expect脚本在自动化部署中的具体应用案例
#expect脚本在自动化部署中的具体应用 expect脚本是一个非常好的交互式应用脚本,在自动化部署中,可以使用这个脚本来实现全自动的自动化部署。下面是一些具体的应用案例。 场景一:自动安装mysql 可以使用expect脚本来实现mysql自动安装&…...
【Java+SQL Server】前后端连接小白教程
目录 📋 流程总览 ⛳️【SQL Server】数据库操作 1. 新建数据库text 2. 新建表 3. 编辑表 ⛳️【IntelliJ IDEA】操作 1. 导入jar包 2. 运行显示错误 📋 流程总览 ⛳️【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语言基础》课程期末考核要求综合运用课程所学知识,使用VS和SQL及相关开发工具,结合DIVCSS等前端设计技术,完成一个具备新闻发布和考试功能的动态系统,要求包括但不限于:用户注册、登录功能、新闻展示功能、后台数…...
Scanner常用知识点
在Java中,Scanner类是用于读取用户输入的工具类,可以从多种输入源读取数据,如标准输入流、文件或字符串。以下是一些Scanner类的常用知识点: Scanner的初始化:在使用Scanner类之前,需要先将其导入到你的Ja…...
uniapp页面使用多个echarts出现数据渲染错乱问题解决
首先,uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的,在官方提供的案例当中,核心代码是这一部分: 但如果将其封装为组件,并在一个页面当中引用多次来生成多个charts图标,那么这个时…...
PHP连接数据库 错误抑制 三元运算符 学习资料
PHP连接数据库 PHP可以通过不同的扩展和库来连接各种类型的数据库。下面是一个使用MySQL数据库的连接示例: <?php $servername "localhost"; $username "your_username"; $password "your_password"; $dbname "your_d…...
5G智慧工地整体解决方案:文件全文115页,附下载
关键词:5G智慧工地,智慧工地建设方案,智慧工地管理平台系统,智慧工地建设调研报告,智慧工地云平台建设 一、5G智慧工地建设背景 5G智慧工地是利用5G技术、物联网、大数据、云计算、AI等信息技术,围绕“人…...
数据结构 / 内存的动态申请和释放
1.内存的动态申请 malloc malloc 的头文件: #include <stdlib.h>格式: void *malloc(size_t size);参数: size_t size: 申请堆区内存大小, 单位是字节;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语言中,表示一次性地给数组a的10元素赋值() int a[10];scanf("%d",a); A:正确 B:错误 答案及解析 B 我们知道单独的数组名就是首元素地址,但是也有…...
[ACTF2020 新生赛]BackupFile
打开题目就一句话:尝试找到源文件 和上一题一样,用dirsearch扫描网站找到了一下内容 flag.php,0B,虚假flag 瞅一眼index.php.bak是啥 下载了一个文件,把bak后缀删掉,打开了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变量分为全局变量,局部变量。 全局变量:默认,全局有效。 局部变量:从作用范围开始到作用范围结束,需加local 修饰。 a1function ff()local b1 endprint(a…...
C#每天复习一个重要小知识day4:枚举的概念/申明/使用
目录 1.枚举的概念: 2.申明枚举和申明枚举变量: 申明枚举语法: 申明枚举变量语法: 1.枚举的概念: 枚举是什么?枚举是一个比较特别的存在,它是一个命名的整形常量的集合,一般用它…...
C++:对象模型和this指针
对象模型: 成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间: 1字节 C编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置 每个…...
告别繁琐配置:YuukiPS Launcher如何让动漫游戏管理变得简单高效
告别繁琐配置:YuukiPS Launcher如何让动漫游戏管理变得简单高效 【免费下载链接】Launcher-PC 项目地址: https://gitcode.com/gh_mirrors/la/Launcher-PC 你是否曾为管理多个游戏版本而头疼?每次切换服务器都需要重新配置代理,不同账…...
响应式导航栏汉堡菜单点击后下拉菜单不显示的解决方案
本文详解响应式导航栏中汉堡图标(hamburger)点击后菜单不展开的常见原因及修复方法,核心在于 CSS 选择器优先级与元素显隐逻辑的匹配,通过添加 .navbar_nav.active .cat { display: block; } 即可精准控制移动端菜单项的可见性。 …...
人工智能之数字生命-自我的4层12模块
一、根判定层 生命周期与边界控制模块 管待机、运行、收束、停止、死亡退出、降级运行。 世界/场景/状态刷新模块 刷新对象、场景、关系、当前值,形成“本轮可判定世界”。 服务值/安全值差额评估模块 统一计算服务差额与安全差额,给后续判断提供标尺。 根需求生成模块 从…...
初学者必看!如何解决Java线程不安全问题
对于java初学者来说,应该听过Java线程不安全的问题:线程修改变量时,会将变量拷贝到本地内存,修改完成后,再写回主内存。这个过程中,如果多个线程同时访问并修改同一个数据,就会出现线程安全问题…...
OpenClaw与Hermes入门基础教程(非常详细),收藏这一篇就够了!
最近 Hermes Agent 很火,媒体、Reddit 上"I ditched OpenClaw for Hermes"的帖子接连不断,国内也有不少朋友在问同一个问题: 它们到底是同一类东西吗?Hermes 能直接替代 OpenClaw 吗? 这个问题正好点中了最…...
Unity手游开发:用Joystick Pack插件搞定移动端虚拟摇杆(附完整代码)
Unity手游开发:Joystick Pack插件深度优化与移动端实战指南 移动游戏的核心体验往往始于指尖与屏幕的第一次触碰。当玩家在拥挤的地铁上单手操作角色闪避子弹,或是在激烈的PVP对战中精准释放技能时,虚拟摇杆的响应速度和操作手感直接决定了游…...
2026年ReactNative热更新主流方案深度对比
React Native热更新方案对比:Shiply、CodePush、Expo、Pushy 与自建,谁才是最佳选择? 在移动应用迭代节奏不断加快的背景下,热更新已成为保障用户体验与业务敏捷的重要技术路径。React Native 的热更新可在不通过应用商店审核的情…...
如何利用over-golang与Protobuf实现高效序列化与RPC通信:完整指南
如何利用over-golang与Protobuf实现高效序列化与RPC通信:完整指南 【免费下载链接】over-golang Golang相关:[审稿进度80%]Go语法、Go并发思想、Go与web开发、Go微服务设施等 项目地址: https://gitcode.com/gh_mirrors/ov/over-golang 在现代软件…...
如何实现uWebSockets认证令牌刷新:自动与手动触发的终极指南
如何实现uWebSockets认证令牌刷新:自动与手动触发的终极指南 【免费下载链接】uWebSockets Simple, secure & standards compliant web server for the most demanding of applications 项目地址: https://gitcode.com/gh_mirrors/uw/uWebSockets uWebSo…...
RDM接收端避坑指南:从哑音状态处理到UID校验,我的调试血泪史
RDM接收端避坑指南:从哑音状态处理到UID校验,我的调试血泪史 灯光控制系统的开发者们,如果你正在为RDM协议接收端的稳定性头疼不已,这篇文章或许能帮你省下几周的通宵调试时间。在实际工程中,协议文档的"理想情况…...
