封裝WebSocket

一個基于原生 WebSocket 的封裝庫,實現了自動重連、心跳檢測等功能,用于在前端應用中穩定地與后端 WebSocket 服務通信。下面從設計思路、關鍵功能等方面進行詳細分析:

設計思路
這個封裝庫采用單例模式設計,全局維護一個 WebSocket 實例,通過狀態管理和事件監聽實現高可用的通信連接。主要特點包括:

集成了心跳機制檢測連接狀態
實現了自動重連邏輯
提供了簡潔的 API 接口
支持自定義配置參數(如重連次數、心跳間隔等)

關鍵功能分析

  1. 初始化與連接管理
init: (receiveMessage: Function | null) => {// 檢查瀏覽器支持if (!('WebSocket' in window)) {console.error('瀏覽器不支持WebSocket')return null}// 構建連接URL,攜帶用戶認證信息socket.connectURL = `ws://${location.host}/api/websocket/connect?Authorization=${useUserStore().token}`// 創建WebSocket實例并綁定事件socket.websocket = socket.websocket || new WebSocket(socket.connectURL)// 綁定事件處理函數...
}

這部分代碼完成了:

瀏覽器兼容性檢查
連接 URL 構建,從用戶狀態中獲取認證 token
WebSocket 實例的創建和事件綁定

  1. 心跳檢測機制
heartbeat: () => {if (socket.heartbeatTimer) {clearInterval(socket.heartbeatTimer)}socket.heartbeatTimer = setInterval(() => {if (socket.heartbeatCurrent > socket.heartbeatCount) {clearInterval(socket.heartbeatTimer)socket.reconnect()} else {socket.send('ping')socket.heartbeatCurrent++}}, socket.heartbeatInterval)
}

心跳機制的工作流程:

定期發送 “ping” 消息
接收到 “pong” 響應時重置計數器
連續多次未收到響應時觸發重連
使用指數退避算法避免頻繁重連

  1. 自動重連實現
reconnect: () => {if (socket.isReconnect) {socket.reconnectTimer = setTimeout(() => {if (socket.reconnectCurrent >= socket.reconnectCount) {socket.isReconnect = falsereturn}socket.reconnectCurrent++console.log('websocket正在重新連接')socket.init(null)}, socket.reconnectInterval)}
}

重連機制的關鍵點:

限制最大重連次數,避免無限重試
使用定時器控制重連間隔
保持重連狀態的跟蹤

  1. 消息處理
websocket.onmessage = (e: MessageEvent) => {const { data } = e// 心跳檢測if (data === 'pong') {socket.heartbeatCurrent = 0return}if (receiveMessage) {receiveMessage(data)}
}

消息處理邏輯:

區分心跳響應和業務消息
通過回調函數將消息傳遞給上層應用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88461.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88461.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS

發表:ICLR24 機構:ETH Zurich 連接:https://arxiv.org/pdf/2401.15024 ABSTRACT 大型語言模型(Large Language Models, LLMs)已成為自然語言處理的基石,但其使用伴隨著在計算和內存資源方面的高昂代價。…

Python 【技術面試題和HR面試題】? 循環結構、控制語句及綜合應用問答

1.技術面試題 (1)詳細描述單調棧的工作原理和應用場景 答: 原理 維護棧內元素單調遞增 / 遞減,新元素入棧前,彈出破壞單調性的棧頂,保持單調。 應用場景 排隊比身高,搭積木找最大的空地 &#x…

100G系列光模塊產品與應用場景介紹

在當今數字化時代,網絡流量呈爆炸式增長,對數據傳輸速度和帶寬的要求也越來越高。100G 光模塊作為高速數據傳輸的關鍵組件,因其卓越的高速傳輸能力,已成為數據中心、云計算、企業網絡以及 5G 通信網絡等領域的重要組成部分。接下來…

運籌說 第140期 | 從直覺到算法:這些奠基人如何塑造了啟發式方法的科學根基?

運籌說建構知識體系,解析學習要點運 籌 優 化 領 域 教 學 媒 體視頻課程已上線!!!歡迎大家關注同名抖音和嗶哩嗶哩賬號!在人工智能與優化科學的浩瀚星空中,啟發式算法如同一把鑰匙,為人類打開了處…

Flutter編譯安卓應用時遇到的compileDebugJavaWithJavac和compileDebugKotlin版本不匹配的問題

記一次flutter應用,編譯安卓時,報的一個compileDebugJavaWithJavac和compileDebugKotlin版本本匹配的問題。 最終定位的原因是項目一來了audioplayers組件。 audioplayers組件有依賴了audioplayers_android, 它使用1.8編譯的。 版本過低。后來…

linux-權限管理

linux-權限管理一、權限的基本類型二、權限的表示方式1. 字符形式(rwx)2. 數字形式三、權限管理常用命令1. chmod2. chown3. chgrp四、隱藏權限1. lsattr2. chattr五、權限掩碼六、特別權限位1. suid2. sgid3. Sticky Bit七、權限委托1. 授權用戶2. 授權…

從FCOS3D到PGD:看深度估計如何快速搭建你的3D檢測項目

【導讀】 還記得那個曾經在單目3D目標檢測領域掀起熱潮的 FCOS3D 嗎?在后續更新中他們又推出了全新升級版——PGD(Probabilistic and Geometric Depth)最有意思的是,這次他們徹底換了路線:從原先的“直接回歸深度”&a…

Apache Cloudberry 向量化實踐(三)重塑表達式構建路徑:Gandiva 優化實戰

在向量化執行系統中,表達式構建是不可或缺的基礎環節。無論是 SQL 中的投影、篩選,還是分區、聚合、排序,最終都需轉化為底層執行引擎能識別和執行的表達式樹。而在 Apache Cloudberry 向量化執行框架中,這一過程由 Gandiva 表達式…

Windows刪除文件或者拔出U盤顯示正在使用/占用解決辦法

1、復制文件地址2、打開任務管理器,選擇左側【性能】3、打開資源監視器4、選擇資源監視器中的CPU5、粘貼你復制的占用文件地址6、除了explore.exe以外,其他的關聯的句柄都選中,然后右鍵結束

自由學習記錄(68)

🧠 blender為什么不用 M 或 T? 鍵位含義為什么沒選MMove?其實被用作「Move to Collection」等功能不符合歷史定義,而且功能太多了TTransform? 但 transform 是一個總稱(含移動、旋轉、縮放)T 被…

ReactNative【實戰系列教程】我的小紅書 8 -- 我(含左側彈窗菜單,右下角圖標等)

最終效果點左上角菜單按鈕,彈出左側菜單后代碼實現app/(tabs)/mine.tsx import icon_add from "/assets/icons/icon_add.png"; import mine_bg from "/assets/images/mine_bg.png"; import Heart from "/components/Heart"; import a…

C++性能優化實戰:從理論到落地的五大核心策略

在當今這個對計算效率要求極高的時代,C作為系統級編程語言的王者,其性能優化能力依然是無可替代的核心競爭力。本文將分享我在大型分布式系統開發中積累的C性能優化實戰經驗,這些經驗幫助我們將關鍵組件的吞吐量提升了300%,延遲降…

字節 Seed 團隊聯合清華大學智能產業研究院開源 MemAgent: 基于多輪對話強化學習記憶代理的長文本大語言模型重構

🔥 最新動態!!! [2025/07] 我們提供了快速啟動腳本,讓使用MemAgent變得超級簡單,詳情請見下方"快速入門"部分。[2025/06] 我們發布了RL-MemAgent-14B和RL-MemAgent-7B模型,在350萬token上下文任務中實現了近乎無損的性…

【unitrix】 4.20 類型級二進制數減法實現解析(sub.rs)

一、源碼 這段代碼實現了一個用于統計二進制補碼整數位數的系統,支持多種自定義數值類型(Z0、P1、N1、B0、B1)。 use core::mem::size_of; use crate::number::{Z0, P1, N1, B0, B1, Var};/// 統計二進制位數的 trait pub trait BitLength {f…

手把手教你安全刪除Anaconda虛擬環境(避坑指南)

文章目錄一、刪除前必看清單(超級重要)二、三種刪除方法對比(建議收藏)方法1:官方推薦命令(最安全)方法2:暴力刪除大法(快速但需謹慎)方法3:核彈級…

Effective Modern C++ 條款7:區分使用 `()` 和 `{}` 創建對象

在 C11 及以后的版本中,初始化對象的方式變得更加靈活,但也帶來了選擇上的困惑。() 和 {} 是兩種常見的初始化語法,它們在語義、行為和適用場景上有顯著差異。本文將通過具體示例,深入解析這兩種初始化方式的區別,并探…

Java基礎-String常用的方法

String常用的三種構造方法 public static void main(String[] args) {//1.使用常量字符串構造String s1 "1.Hello world";System.out.println(s1);//2.使用new關鍵字構造String s2 new String("2.Hello world");System.out.println(s2);//3。使用字符數組…

數學建模:多目標規劃:ε約束法、 理想點法

一、ε約束法定義ε約束法通過將部分目標函數轉化為約束條件,保留一個主要目標進行優化。1、選擇一個主要目標 fk?(x) 進行優化。2、其他目標 fi?(x) 轉化為約束 fi?(x)≤εi?,其中 εi? 是決策者設定的容許閾值。??原理????目標選擇??&…

linux kernel struct regmap_config結構詳解

在 Linux 內核中,struct regmap_config 是 ?Regmap 子系統的核心配置結構體,用于定義如何與底層硬件寄存器進行交互。Regmap(Register Map)子系統通過抽象不同總線(如 I2C、SPI、MMIO 等)的寄存器訪問細節…

【Python3教程】Python3高級篇之CGI編程

博主介紹:?全網粉絲23W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…