使用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
英文地址,請注明出處:http://en.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…