前端對WebSocket進行封裝,并建立心跳監測

WebSocket的介紹:

WebSocket 是一種在客戶端和服務器之間進行全雙工、雙向通信的協議。它是基于 HTTP 協議,但通過升級(HTTP 升級請求)將連接轉換為 WebSocket 協議,從而提供更高效的實時數據交換。

WebSocket 的特點:

  1. 雙向通信:與傳統的 HTTP 協議只能從客戶端向服務器發送請求并等待響應不同,WebSocket 可以實現服務器主動向客戶端推送數據,支持雙向通信。

  2. 持久連接:WebSocket 連接建立后,它是持久的,可以在不重新建立連接的情況下進行多次數據交換。相比于傳統的 HTTP 每次請求都需要建立新的連接,WebSocket 減少了很多開銷。

  3. 實時性:由于 WebSocket 的全雙工通信特性,它非常適合需要實時更新數據的應用場景,如即時聊天、在線游戲、股票行情等。

  4. 低延遲:WebSocket 建立連接后,數據可以隨時在客戶端和服務器之間交換,而且沒有 HTTP 協議中的請求和響應過程,因此延遲非常低。

  5. 協議格式:WebSocket 協議位于應用層與 TCP 層之間,它的標準端口是 80(非加密連接)和 443(加密連接)。

WebSocket 工作原理:

  1. 連接建立:客戶端發起一個 HTTP 請求,并通過 HTTP 升級請求(Upgrade?請求頭)向服務器請求升級協議為 WebSocket。
  2. 協議升級:如果服務器支持 WebSocket 協議,它會響應?101 Switching Protocols,并升級為 WebSocket 協議。此時,WebSocket 連接建立成功。
  3. 數據交換:一旦連接建立,客戶端和服務器可以在同一連接上發送和接收消息,直到連接被關閉。
  4. 連接關閉:無論是客戶端還是服務器,都可以主動發起關閉連接。連接關閉時,雙方會互相發送關閉幀(Close Frame)來通知對方。

項目需求:

由于最近項目上的大屏接口要換成WebSocket進行實時數據展示,于是需要對WebSocket進行封裝,主要目標是要實現與后端持續保持心跳連接,不要讓WebSocket中斷;例如每10秒就要和后端通訊一次,發送和后端溝通好固定的心跳標識符,后端拿到心跳標識符就會持續保持連接,如果一直沒有收到前端返回的心跳標識符,那么就會中斷WebSocket的連接。

源代碼

export default class WebSocketClient {constructor(url, callback) {this.url = url;           // WebSocket 服務器的 URLthis.callback = callback; // 回調方法,用于接收數據this.ws = null;           // WebSocket 實例this.heartbeatInterval = 20000; // 心跳間隔(20秒)this.pingTimeout = 10000;        // ping 超時時間(10秒)this.heartbeatTimer = null;      // 用于存儲心跳定時器this.pingTimer = null;           // 用于存儲 ping 超時定時器this.reconnect = true;          // 用于判斷是否需要重連}// 啟動 WebSocket 連接start() {this.ws = new WebSocket(this.url);this.ws.onopen = () => {console.log("WebSocket連接成功");this.reconnect = true; // 連接成功,允許重連this.startHeartbeat(); // 連接成功后開始心跳};this.ws.onmessage = (event) => {this.callback(event.data); // 調用回調方法};this.ws.onerror = (error) => {console.error("WebSocket異常:", error);};this.ws.onclose = (event) => {console.log("WebSocket關閉.");clearInterval(this.heartbeatTimer); // 清除心跳定時器clearTimeout(this.pingTimer); // 清除 ping 超時定時器if (this.reconnect && event.code !== 1000) { // 如果是非正常關閉,進行重連console.log("嘗試重新連接...");setTimeout(() => {this.start(); // 5秒后重新連接}, 5000);}};}// 發送數據到服務器send(message) {if (this.ws && this.ws.readyState === WebSocket.OPEN) {this.ws.send(message);} else {console.error("消息發送失敗.");}}// 啟動心跳機制startHeartbeat() {this.heartbeatTimer = setInterval(() => {if (this.ws.readyState === WebSocket.OPEN) {this.send(JSON.stringify({ type: "heartbeat", data: "pong" })); // 與后端約定的心跳標識符,用于保持持續連接}}, this.heartbeatInterval);// 設置 ping 超時機制this.pingTimer = setTimeout(() => {if (this.ws.readyState !== WebSocket.OPEN) {console.error("超時關閉連接.");this.ws.close();}}, this.pingTimeout);}// 主動關閉連接close() {this.reconnect = false;  // 主動關閉時不再進行重連if (this.ws) {this.ws.close(1000, 'Closed by client'); // 主動關閉時使用 code 1000 表示正常關閉}}
}

用法

import WebSocketClient from '@/request/ws'export default {data(){return{wsClient:null}},mounted(){this.wsClient = new WebSocketClient('ws://192.168.31.21:8090/ws', this.getWSMessage);this.wsClient.start()},methods:{getWSMessage(data){console.log(data,'ddddddddddddddd')},sendMessage(){let obj = { type: "555", data: "111111" }this.wsClient.send(JSON.stringify(obj))}},beforeDestroy() {this.wsClient.close()}
}

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

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

相關文章

【AI】智駕地圖在不同自動駕駛等級中的作用演變

一、功能價值動態模型:基于自動駕駛等級的權重遷移 功能演變四階段: █ 輔助階段(L2):單功能補足 → █ 拓展階段(L2 NOA):多模態增強 → █ 融合階段(L3)…

Java處理字符數組轉換為開始日期和結束日期

在Java中處理字符數組表示的TransactionTime(例如["2025-06-01","2025-06-10"]),將其轉換為開始時間和結束時間,推薦使用Java 8的java.time API(如LocalDate)。以下是完整代碼示例&…

【筆記】Poetry虛擬環境創建示例

#工作記錄 【筆記】結合 Conda任意創建和配置不同 Python 版本的雙軌隔離的 Poetry 虛擬環境-CSDN博客 在PowerShell中: Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improv…

20242817李臻-安全文件傳輸系統-項目驗收

安全文件傳輸系統項目報告 項目概述 本實驗旨在設計并實現一個完整的安全文件管理系統,基于SM2SM3SM4混合密碼體系,構建了一個具備高安全性的C/S架構文件傳輸平臺。項目采用C/S架構,使用Qt框架開發,滿足Linux系統調用、Socket網…

2025年- H76-Lc184--55.跳躍游戲(貪心)--Java版

1.題目描述 2.思路 只要是在最大覆蓋范圍覆蓋了,就是覆蓋了。 局部最優:每遍歷一個元素取它最大的覆蓋范圍 全局最優:在這個序列里,可以得到最大的覆蓋范圍。如果覆蓋范圍能達到最后一個元素,就是全局最優 &#xff0…

05.查詢表

查詢表 字段顯示可以使用別名: col1 AS alias1, col2 AS alias2, … WHERE子句:指明過濾條件以實現“選擇"的功能: 過濾條件: 布爾型表達式算術操作符:,-,*,/,%比較操作符:,<>(相等或都為空),<>,!(非標準SQL),>,>,<,<范圍查詢: BETWEEN min_num …

Python學習——數組的行列互換

數組的行列互換 data [ [col for col in range (4)] for row in range (4)] for row in data: print (row) print(“--------------”) for r_index,row in enumerate(data): for c_index in range (r_index,len(row)): tmp data [c_index] [r_index] data[c_index] [r_index…

bugku 應急加固1

Linux的應急加固 一、JS劫持 獲取JS劫持域名 JS劫持&#xff0c;JavaScript Hijacking介紹&#xff1a; 攻擊者通過某種方式篡改網頁中的JavaScript代碼&#xff0c;從而使網頁跳轉到惡意域名。 常見攻擊方式有&#xff1a; 中間人攻擊&#xff0c;在網絡傳輸過程中攔截并修…

ant-design4.xx實現數字輸入框; 某些輸入法數字需要連續輸入兩次才顯示

目錄 一、問題 二、解決方法 三、總結 一、問題 1.代碼里有一個基于ant封裝的公共組件數字輸入框&#xff0c;測試突然說 無效了&#xff0c;輸入其他字符也會顯示&#xff1b;改了只有又發現某些 輸入法 需要連續輸入兩次 才能顯示出來。 二、解決方法 1.就離譜&#xff0…

鄭州工程技術學院赴埃文科技開展訪企拓崗促就業活動

6 月 3 日&#xff0c;鄭州工程技術學院信息工程學院&軟件學院黨總支書記尚德基、校企合作處處長吳博、軟件學院院長葉愷、信息工程學院院長馬耀鋒、副院長黃繼海、河南省人工智能產業創新發展聯盟執行秘書長孟松濤等領導一行到訪鄭州埃文科技有限公司。埃文科技總經理助理…

pandas 字符串存儲技術演進:從 object 到 PyArrow 的十年歷程

文章目錄 1. 引言2. 階段1&#xff1a;原始時代&#xff08;pandas 1.0前&#xff09;3. 階段2&#xff1a;Python-backed StringDtype&#xff08;pandas 1.0 - 1.3&#xff09;4. 階段3&#xff1a;PyArrow初次嘗試&#xff08;pandas 1.3 - 2.1&#xff09;5. 階段4&#xf…

[特殊字符] 在 React Native 項目中封裝 App Icon 一鍵設置命令(支持參數與默認路徑)

?? 前置依賴 使用的是社區維護的 CLI 工具: @bam.tech/react-native-make它擴展了 react-native 命令,支持 set-icon 功能。 安裝: yarn add -D "@bam.tech/react-native-make"?? 封裝目標 我們希望能夠通過以下方式調用: # 默認使用 ./icon.png yarn …

[論文閱讀] 人工智能 | 搜索增強LLMs的用戶偏好與性能分析

【論文解讀】Search Arena&#xff1a;搜索增強LLMs的用戶偏好與性能分析 論文信息 作者: Mihran Miroyan, Tsung-Han Wu, Logan King等 標題: Search Arena: Analyzing Search-Augmented LLMs 來源: arXiv preprint arXiv:2506.05334v1, 2025 一、研究背景&#xff1a;…

[2025CVPR]確定性圖像轉換新突破:雙逼近器布朗橋模型(Dual-approx Bridge)技術詳解

本文深入解析CVPR 2024頂會論文《Deterministic Image-to-Image Translation via Denoising Brownian Bridge Models with Dual Approximators》,揭示確定性圖像轉換的核心突破 一、問題背景:確定性圖像轉換的挑戰 在圖像轉換任務中(如超分辨率、醫學影像處理),?確定性…

Python Pytest

1.Pytest用例發現規則 1.1 模塊名(python文件)名必須以 test_ 開頭或 _test 結尾&#xff0c;如 test_case&#xff0c;case_test&#xff0c;下劃線都不能少 1.2 模塊不能放在 . 開頭的隱藏目錄或者叫 venv的目錄下&#xff0c;virtual environment&#xff0c;叫venv1都可以…

CSRF(跨站請求偽造)詳解

目錄 一、&#x1f4d6;什么是CSRF 二、&#x1f517;漏洞利用過程 三、&#x1f4d1;漏洞的前提條件 四、&#x1f50d;常見漏洞發生位置 五、?CSRF挖掘技巧 (一) 抓正常請求包進行初步判斷 (二) Referer 繞過驗證測試 (三) Token 缺失與二次驗證缺失識別 六、??漏…

深入解析 Qwen3-Embedding 的模型融合技術:球面線性插值(Slerp)的應用

在深度學習領域&#xff0c;模型融合技術是一種強大的工具&#xff0c;用于提升模型的魯棒性和泛化能力。通過結合多個模型的優勢&#xff0c;可以減少單一模型的過擬合風險&#xff0c;并在多種任務中實現更優的性能表現。在 Qwen3-Embedding 的訓練過程中&#xff0c;模型融合…

【在線五子棋對戰】二、websocket 服務器搭建

文章目錄 Ⅰ. WebSocket1、簡介2、特點3、原理解析4、報文格式 Ⅱ. WebSocketpp1、認識2、常用接口3、websocketpp庫搭建服務器搭建流程主體框架填充回調函數細節 4、編寫 makefile 文件5、websocket客戶端 Ⅰ. WebSocket 1、簡介 WebSocket 是從 HTML5 開始支持的一種網頁端…

針對異構數據的聯邦學習

在聯邦學習中&#xff0c;數據異構性是指不同客戶端之間的數據分布差異&#xff0c;包括數據的特征空間、標簽空間以及數據量等方面的差異。處理異構數據是聯邦學習中的一個重要挑戰&#xff0c;因為異構數據可能導致模型訓練過程中的性能不穩定、收斂速度較慢&#xff0c;甚至…

【判斷自整除數】2022-4-6

緣由是判斷自整除數的&#xff0c;這個我的結果是正確的&#xff0c;但是提交就有運行錯誤是怎么回事啊-編程語言-CSDN問答 void 自整除數字() {//所謂的自整除數字就是該數字可以整除其每一個位上的數字。 //對一個整數n,如果其各個位數的數字相加得到的數m能整除n,則稱n為自…