使用websockt

封装websocktHooks

import { ref, onMounted, onUnmounted } from 'vue';/*** webSocket的Hooks* @param {string} websocket链接地址* */ 
export function useWebSocket(url: string) {// 核心状态  const data: Ref<any> = ref(null);//收到websocket返回的数据const socket: Ref<WebSocket | null> = ref(null);//收到websocket返回的数据const isConnected: Ref<boolean> = ref(false);//是否链接成功const reconnectTimer: Ref<NodeJS.Timeout | null> = ref(null);//定时器变量const heartbeatTimer: Ref<NodeJS.Timeout | null> = ref(null);//定时器变量const HEARTBEAT_INTERVAL = 30000;  // 心跳时间 const RECONNECT_DELAY = 5000;//重连时间/***   创建连接* */ const connect = () => {if (socket.value) {socket.value.close();}// 初始化 WebSocket(传入 URL 和配置)socket.value = new WebSocket(url);// 连接成功  socket.value.onopen = () => {console.log('WebSocket 连接成功');isConnected.value = true;clearReconnectTimer();startHeartbeat();};// 接收消息  socket.value.onmessage = (event) => {try {data.value = JSON.parse(event.data);} catch (error) {console.error('消息解析失败', error);data.value = event.data;}};// 连接关闭  socket.value.onclose = (event) => {console.log(`WebSocket 关闭(代码:${event.code})`);isConnected.value = false;stopHeartbeat();startReconnectTimer();};// 连接错误socket.value.onerror = (error) => {console.error('WebSocket 错误', error);isConnected.value = false;};};/***  发送消息* */const send = (message: any) => {if (isConnected.value && socket.value) {try {const sendData = typeof message === 'string' ? message : JSON.stringify(message);socket.value.send(sendData);} catch (error) {console.error('发送消息失败', error);}}};/***  心跳检测* */const startHeartbeat = () => {stopHeartbeat();heartbeatTimer.value = setInterval(() => {if (isConnected.value && socket.value) {send({ type: 'heartbeat' });console.log('发送心跳包');}}, HEARTBEAT_INTERVAL);};/***   停止心跳* */const stopHeartbeat = () => {if (heartbeatTimer.value) {clearInterval(heartbeatTimer.value);heartbeatTimer.value = null;}};/***   启动重连计时器* */const startReconnectTimer = () => {clearReconnectTimer();reconnectTimer.value = setTimeout(() => {console.log('尝试重连...');connect();}, RECONNECT_DELAY);};/***  清除重连计时器* */const clearReconnectTimer = () => {if (reconnectTimer.value) {clearTimeout(reconnectTimer.value);reconnectTimer.value = null;}};/***  手动关闭连接* */const close = () => {if (socket.value) {socket.value.close(1000, '手动关闭');}stopHeartbeat();clearReconnectTimer();};// 组件挂载时连接onMounted(() => connect());// 组件卸载时彻底关闭onUnmounted(() => {close();});return {data,isConnected,send,connect,close};
}

使用

这样就可以请求到websocket了,并且每过30秒发送心跳,来判断连接是否正常,断开连接后5秒重新连接,关闭连接需要调用close()方法

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

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

相关文章

Jmeter自定义脚本

目录 log&#xff1a;输出类 Label&#xff1a;你自定义的组件的名称 FileName&#xff1a;添加的脚本文件的文件名 Parameters&#xff1a;你传入的参数&#xff0c;是一个字符串 args&#xff1a;你传入的参数&#xff0c;是一个数组 Parameters和args的异同&#xff1…

飞算 JavaAI 电商零售场景实践:从订单峰值到供应链协同的全链路技术革新

目录 一、电商核心场景的技术攻坚 1.1 分布式订单系统的事务一致性设计 1.1.1 TCC 模式下的订单创建流程 1.1.2 订单状态机的可靠流转 1.2 高并发秒杀系统的架构设计 1.2.1 多级限流与流量削峰 1.2.2 库存防超卖机制 1.3 智能推荐与用户行为分析 1.3.1 用户行为实时采…

51单片机-51单片机介绍

51单片机介绍单片机简介什么是单片机呢&#xff1f;单片机是一种集成电路芯片&#xff0c;采用超大规模集成电路技术将中央处理器&#xff08;CPU&#xff09;、随机存储器&#xff08;RAM&#xff09;、只读存储器&#xff08;ROM&#xff09;、多种I/O口、中断系统、定时器/计…

8月AI面试工具测评:破解规模化招聘难题

金秋校招临近&#xff0c;企业面临“百万简历涌入VS面试官团队告急”的典型困境。传统线下面试效率低下、标准参差&#xff0c;难以应对短时间内爆发式的人才筛选需求。AI面试工具凭借自动化与智能化特性成为破局关键&#xff0c;但市面上产品良莠不齐——究竟哪款能兼顾效率与…

Debian新一代的APT软件源配置文件格式DEB822详解

Debian 的 DEB822 格式详解&#xff1a;新一代 APT 源配置 DEB822 是一种基于 RFC 822 数据格式的配置文件语法&#xff0c;Debian 新一代的 APT 软件源配置文件格式就采用了 DEB822。DEB822 格式从 Debian 11 (Bullseye) 开始被引入&#xff0c;并在 Debian 12 (Bookworm) 中成…

实战 AI8051U 音视频播放:USART-SPI→DMA-P2P→SPI+I2S 例程详解

视频P2P播放&#xff0c;时间计算&#xff1a;fps20,50ms 周期刷屏时间&#xff1a;160*80 一帧刷屏时间28.2ms帧间隔&#xff1a;50ms-28.2ms21.8ms音频双缓冲区交叉播放&#xff0c;利用视频播放帧间隔加载下一个缓冲区音频数据&#xff0c;时间计算&#xff1a;16000采样率 …

解释器模式C++

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于定义一种语言的语法规则&#xff0c;并构建一个解释器来解释该语言中的句子。这种模式适用于需要处理固定语法规则的场景&#xff0c;如表达式解析、配置文件解析等。 解释器模式…

debian 13 显示中文字体 不再显示菱形块 终端显示中文

找了很多坑。。其它就安装一下中文字体即可 。 apt install ttf-wqy-zenhei 之后测试命令 fc-list &#xff1a;langzh 显示了刚字体的路径和中文字即成功了。 rootdebian:~# dpkg-reconfigure locales 以上命令配置中文语言。 debian 12.11 安装 MySQL 下载配置文件 &am…

51单片机-驱动蜂鸣器模块教程

本章概述思维导图&#xff1a; 51单片机驱动蜂鸣器模块教程 蜂鸣器简介 蜂鸣器是一种将电信号转换为声音信号的电子元件&#xff0c;广泛应用于报警、提示、通知等场景。其核心原理基于压电效应或电磁感应&#xff1a;因此可分为两种类型蜂鸣器&#xff1a;压电式蜂鸣器和电磁…

常用Linux指令:Java/MySQL/Tomcat/Redis/Nginx运维指南

一、基础Linux指令1. 文件与目录操作ls -lh # 查看文件详情(人类可读格式) pwd # 显示当前目录路径 cd /path # 切换目录 mkdir dirname # 创建目录 rm -rf dirname # 强制删除目录 cp -r src dest # 递归复制目录 mv old new # 移动/重命…

小红书帖子评论的nodejs爬虫脚本

从小红书上爬取评论&#xff0c;但是目前还不能完全爬取子评论&#xff0c;使用GPT没能解决这个问题。后续博主可能会改进。或者如果你懂的话&#xff0c;可以在博主代码基础上改进。需要安装nodejs软件&#xff0c;部署环境变量。博主是在pycharm中运行的。代码无套路获取。自…

【iOS】多线程原理

目录 前言 基本概念及原理 线程、进程与队列 线程的定义&#xff1a; 进程的定义&#xff1a; 线程与进程之间的联系与区别&#xff1a; 线程和runloop的关系 影响任务执行速度的因素 多线程 多线程生命周期 线程池的原理 iOS中多线程的实现方式 线程安全问题 互斥…

药房发药的“时间密码”:同步时钟用药安全?

在医院的药房里&#xff0c;每一粒药片的流转都暗藏“时间密码”。从药品入库到患者服药&#xff0c;时间记录的精确性直接关乎生命安全。一旦时间数据出现偏差&#xff0c;轻则导致用药争议&#xff0c;重则引发医疗事故。近年来&#xff0c;随着医疗数字化进程加速&#xff0…

UI-TARS-Desktop 深度解析:下一代智能自动化桌面平台

目录 1. 产品概述 2. 核心功能与技术架构 2.1 关键技术 2.2 功能亮点 3. 竞品对比分析 4. 部署与成本分析 4.1 部署方案 4.2 隐性成本 5. 商业化前景 5.1 目标市场 5.2 盈利模式 5.3 风险挑战 6. 未来演进方向 7. 总结 1. 产品概述 UI-TARS-Desktop 是一款基于A…

STM32L051同时处理Alarm A和Alarm B中断

同时处理Alarm A和Alarm B中断 当同时启用Alarm A和Alarm B时&#xff0c;需要在中断处理程序中准确判断是哪个闹钟触发了中断。以下是完整的解决方案&#xff1a; 中断判断与处理流程 1. 在RTC中断服务程序中判断中断源 // stm32l0xx_it.c void RTC_IRQHandler(void) {/* USER…

OpenCV---morphologyEx形态学操作

在计算机视觉与图像处理领域&#xff0c;形态学操作是一种基于图像形状的非线性处理方法&#xff0c;广泛应用于噪声去除、边缘检测、目标分割等任务。OpenCV提供的morphologyEx函数是形态学操作的“瑞士军刀”&#xff0c;它整合了多种高级形态学运算&#xff0c;能够实现开运…

RuoYi-Cloud 接入 Sentinel 的 3 种限流方式

场景&#xff1a; 服务&#xff1a;ruoyi-robot&#xff08;对外接口统一在 /external/gs/**&#xff09; 网关&#xff1a;ruoyi-gateway&#xff08;转发到 ruoyi-robot&#xff09; 注册/配置&#xff1a;Nacos 流控&#xff1a;Sentinel 1.8.x 控制台 Dashboard&#x…

快速搭建python HTTP Server测试环境

这里用python http.server搭建一个api测试环境&#xff0c;自定义请求处理程序&#xff0c;以模拟不同api相应。 1 服务代码 /api/data&#xff0c;端口8000&#xff0c;GET 返回json数据为"{"message": "This is a sample API response"}" 代…

Docker容器定时任务时区Bug导致业务异常的环境变量配置解决方案

Docker容器定时任务时区Bug导致业务异常的环境变量配置解决方案 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是…

解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程

文章目录解锁Dify与MySQL的深度融合&#xff1a;MCP魔法开启数据新旅程引言&#xff1a;技术融合的奇妙开篇认识主角&#xff1a;Dify、MCP 与 MySQL&#xff08;一&#xff09;Dify&#xff1a;大语言模型应用开发利器&#xff08;二&#xff09;MCP&#xff1a;连接的桥梁&am…