Vue3 + WebSocket

Vue3與WebSocket結合能夠很好地滿足實時通訊的需求。通過合理設計和管理WebSocket連接的生命周期,以及實現必要的重連邏輯和心跳檢測機制,可以構建出響應迅速且穩定的實時應用。

WebSocket

WebSocket允許服務端主動向客戶端發送數據,無需客戶端發起請求,從而實現了低延遲、高效率的數據交換。它通過HTTP升級協議握手來建立持久性的連接,并使用幀(frame)的形式傳輸數據。

Vue3中實現WebSocket通訊

創建WebSocket實例

首先,在Vue3組件中創建一個WebSocket實例,并監聽其生命周期事件:

<template><!-- 省略其他UI元素 --><button @click="sendMessage">發送消息</button><ul><li v-for="(message, index) in messages" :key="index">{{ message }}</li></ul>
</template><script setup>
import { ref } from 'vue';// 創建WebSocket實例,替換為你的實際服務器地址
const ws = new WebSocket('ws://your-websocket-server-url/webSocket');// 初始化消息數組
const messages = ref([]);// 監聽WebSocket打開事件
ws.addEventListener('open', () => {console.log('WebSocket已連接');
});// 監聽接收到消息的事件
ws.addEventListener('message', (event) => {const data = JSON.parse(event.data);messages.value.push(data.message);
});// 發送消息至服務器的方法
function sendMessage() {const message = 'Hello, Server!';ws.send(JSON.stringify({ message }));
}// 監聽WebSocket關閉事件
ws.addEventListener('close', () => {console.log('WebSocket連接已關閉');
});// 監聽錯誤事件
ws.addEventListener('error', (error) => {console.error('WebSocket發生錯誤:', error);
});
</script>

上述代碼展示了如何在Vue3組件內初始化WebSocket連接,并添加了基本的消息發送和接收功能。

管理WebSocket連接的生命周期

在真實項目中,你需要考慮在組件掛載時建立連接,在卸載時關閉連接,以確保資源的有效管理和回收:

<script setup>
import { onMounted, onUnmounted } from 'vue';let ws;onMounted(() => {ws = new WebSocket('ws://your-websocket-server-url/webSocket');// ... 添加其他生命周期事件監聽器
});onUnmounted(() => {if (ws.readyState !== WebSocket.CLOSED) {ws.close();}
});
</script>

    webSocket.readyState

    readyState屬性返回實例對象的當前狀態,共有四種。

    • CONNECTING:值為0,表示正在連接。
    • OPEN:值為1,表示連接成功,可以通信了。
    • CLOSING:值為2,表示連接正在關閉。
    • CLOSED:值為3,表示連接已經關閉,或者打開連接失敗。
    處理重連邏輯和心跳檢測

    為了保證WebSocket連接的穩定性和可靠性,通常還需要實現重連邏輯以及心跳檢測機制。當連接斷開時,可以嘗試重新連接;同時,定期發送心跳包維持長連接,防止因網絡波動導致的意外斷開。

    <script setup>
    import { ref, watchEffect } from 'vue';// ... 其他變量定義和初始化// 用于控制重連的計數器
    const reconnectAttempts = ref(0);// 在斷開連接后嘗試重新連接
    function handleReconnect() {setTimeout(() => {reconnectAttempts.value++;if (reconnectAttempts.value <= MAX_RECONNECT_ATTEMPTS) {connectWebSocket();} else {console.log('超過最大重試次數,停止重連');}}, RECONNECT_DELAY);
    }// 心跳檢測函數
    function sendHeartbeat() {// 定期發送心跳包給服務器ws.send(JSON.stringify({ type: 'heartbeat' }));
    }// 在連接成功后啟動心跳檢測
    function startHeartbeat() {setInterval(sendHeartbeat, HEARTBEAT_INTERVAL);
    }// 連接WebSocket的方法
    function connectWebSocket() {ws = new WebSocket('ws://your-websocket-server-url/webSocket');// 添加事件監聽器...// ...ws.addEventListener('close', handleReconnect);ws.addEventListener('open', startHeartbeat);
    }onMounted(connectWebSocket);
    // ... 其他生命周期處理
    </script>

      實例對象的onmessage屬性,用于指定收到服務器數據后的回調函數。

      
      ws.onmessage = function(event) {var data = event.data;// 處理數據
      };ws.addEventListener("message", function(event) {var data = event.data;// 處理數據
      });
      

      注意,服務器數據可能是文本,也可能是二進制數據(blob對象或Arraybuffer對象)。

      
      ws.onmessage = function(event){if(typeof event.data === String) {console.log("Received data string");}if(event.data instanceof ArrayBuffer){var buffer = event.data;console.log("Received arraybuffer");}
      }
      

      除了動態判斷收到的數據類型,也可以使用binaryType屬性,顯式指定收到的二進制數據類型。

      
      // 收到的是 blob 數據
      ws.binaryType = "blob";
      ws.onmessage = function(e) {console.log(e.data.size);
      };// 收到的是 ArrayBuffer 數據
      ws.binaryType = "arraybuffer";
      ws.onmessage = function(e) {console.log(e.data.byteLength);
      };

      webSocket.send()

      實例對象的send()方法用于向服務器發送數據。

      發送文本的例子。

      
      ws.send('your message');
      

      發送 Blob 對象的例子。

      
      var file = document.querySelector('input[type="file"]').files[0];
      ws.send(file);
      

      發送 ArrayBuffer 對象的例子。

      
      // Sending canvas ImageData as ArrayBuffer
      var img = canvas_context.getImageData(0, 0, 400, 320);
      var binary = new Uint8Array(img.data.length);
      for (var i = 0; i < img.data.length; i++) {binary[i] = img.data[i];
      }
      ws.send(binary.buffer);
      

      webSocket.bufferedAmount

      實例對象的bufferedAmount屬性,表示還有多少字節的二進制數據沒有發送出去。它可以用來判斷發送是否結束。

      
      var data = new ArrayBuffer(10000000);
      socket.send(data);if (socket.bufferedAmount === 0) {// 發送完畢
      } else {// 發送還沒結束
      }

      總結

      綜上所述,Vue3與WebSocket結合能夠很好地滿足實時通訊的需求。通過合理設計和管理WebSocket連接的生命周期,以及實現必要的重連邏輯和心跳檢測機制,可以構建出響應迅速且穩定的實時應用。在實際開發中,還可以根據具體業務需求對WebSocket通訊做更深入的定制和優化。

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

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

      相關文章

      IPSec和HTTPS對比(一)

      IPSec&#xff08;Internet Protocol Security&#xff09;是網絡層&#xff08;OSI第3層&#xff09;的加密協議&#xff0c;其核心機制和與HTTPS的區別如下&#xff1a;&#x1f512; ?一、IPSec的核心機制解析??1. 安全封裝結構?┌──────────┬───────…

      關于 c、c#、c++ 三者區別

      1. 起源與定位語言起源時間開發者定位/特點C1972年Dennis Ritchie面向過程的編程語言&#xff0c;強調底層控制與高效性能C1983年Bjarne Stroustrup在 C 的基礎上加入 面向對象編程&#xff08;OOP&#xff09;C#2000年微軟&#xff08;Microsoft&#xff09;類似 Java&#xf…

      項目總體框架(servlet+axios+Mybatis)

      項目總體框架 先暫時這樣子&#xff08;后續發現錯誤的話就改&#xff09; com.hope-tieba/ ← 項目根 ├─ .idea/ ← IDEA 工程配置 ├─ src/ │ ├─ main/ │ │ ├─ java/ │ │ │ └─ com/hope/ │ │ …

      RestTemplate 實現后端 HTTP 調用詳解

      1. 方法簽名解析方法名和返回類型說明了這個方法的業務意圖和數據結構。Override 表示實現接口方法&#xff0c;利于規范開發和自動檢查。Override public List<RobotInfo> listRobots() {這里 RobotInfo 是假設的業務數據結構&#xff0c;實際項目中按你的類名即可。2. …

      Python單例模式詳解:從原理到實戰的完整指南

      引言 單例模式是軟件設計中最常用的模式之一&#xff0c;它確保一個類只有一個實例&#xff0c;并提供全局訪問點。在Python中&#xff0c;實現單例模式有多種優雅的方式&#xff0c;本文將詳細講解6種主流實現方法&#xff0c;包含完整代碼示例和注釋。 一、模塊級單例&#x…

      拼團系統中的冪等性防護 , 前置性查詢,Redis 庫存預判

      這段內容涉及兩個關鍵點&#xff1a;冪等性防護 和 拼團目標量判斷&#xff0c;下面我將分別解釋這兩個問題&#xff0c;并重點說明&#xff1a; “如果沒有攔截&#xff0c;最終訪問數據&#xff0c;也會有數量判斷攔截。” 這句話的意思。 ? 1. 查詢外部交易 outTradeNo 是…

      【Python】LEGB作用域 + re模塊 + 正則表達式

      文章目錄一 LEGB作用域二 re&#xff08;Regular Expression&#xff09;預覽1. re.match() —— 從字符串開頭匹配2. re.search() —— 搜索整個字符串3. re.findall() —— 返回所有匹配的字符串列表4. re.finditer() —— 返回所有匹配的迭代器5. re.sub() —— 替換匹配的字…

      JavaSE -- 數據操作流

      6. 數據操作流在執行文件存儲一個對象的時候&#xff0c;如果該對象只有少量屬性需要存儲&#xff0c;并且這些屬性的類型都是基本數據類型&#xff0c;此時則不需要對象序列化技術。使用數據操作流既可以實現。 DataOutputStreamDataInputStream 注意&#xff1a; 讀取數據的時…

      GI6E 加密GRID電碼通信SHELLCODE載入

      GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…

      實習十三——傳輸層協議

      補充子網劃分的主要目的就是為了節約IP&#xff0c;降低成本&#xff0c;但是如果劃分私有IP網段&#xff0c;則完全沒有意義&#xff0c;因為私有IP可重復&#xff0c;不要錢&#xff0c;所以私有IP嚴禁進行子網掩碼劃分傳輸層協議TCP三次握手TCP協議數據格式第一次握手&#…

      RPG59.玩家拾取物品三:可拾取物品的提示UI

      1。以WarriorWidgetBase作為父類&#xff0c;創建一個子類的userwidget2.布局為兩個值都為1203。然后我們需要想辦法&#xff0c;在合適的位置&#xff0c;用bool來控制此控件的顯示與隱藏。情況為&#xff1a;當玩家觸發與可拾取物體的重疊時&#xff0c;我們將廣播一個bool值…

      Vue.js 國際化 (i18n) 實踐:讓你的應用走向全球,多語言支持如此簡單!

      文章目錄一、為何你的 Vue.js 應用需要“說多種語言”&#xff1f;國際化的重要性二、Vue I18n 基礎實踐&#xff1a;從零開始搭建多語言環境2.1 安裝 Vue I18n2.2 配置 Vue I18n 實例2.3 在組件中使用翻譯三、進階實踐&#xff1a;讓國際化更強大、更靈活3.1 動態語言切換3.2 …

      在CentOS7.9服務器上安裝.NET 8.0 SDK

      在 CentOS 7.9 系統上手動安裝 .NET 8.0 SDK&#xff08;使用本地的 dotnet-sdk-8.0.101-linux-x64.tar.gz 文件&#xff09;&#xff0c;可以按照以下步驟進行操作。由于 CentOS 7.9 已不再被微軟官方支持&#xff0c;可能會遇到依賴庫版本問題&#xff08;如 GLIBCXX 和 GLIB…

      HarmonyOS-ArkUI Web控件基礎鋪墊4--TCP協議- 斷聯-四次揮手解析

      HarmonyOS-ArkUI&#xff1a; Web組件加載流程1 HarmonyOS-ArkUI Web控件基礎鋪墊1-HTTP協議-數據包內容 HarmonyOS-ArkUI Web控件基礎鋪墊2-DNS解析 HarmonyOS-ArkUI Web控件基礎鋪墊3--TCP協議- 從規則本質到三次握手-CSDN博客 接上文&#xff0c;上文我們講解了: 數據在…

      如何用AI 生成論文/書籍的摘要

      不知道大家是否有這樣的感覺&#xff0c;上網瀏覽信息&#xff0c;看到好的文章就興奮地下載了下來&#xff0c;文件的名稱通常是一串奇奇怪怪的字符串。過了幾天就在電腦中找不著了。沒有網絡上搜索不到的文章&#xff0c;而是在你的電腦中卻找不到它們。幾年下來&#xff0c;…

      ubuntu系統+N卡 | docker compose+ollama+dify(dify和ollama在同一容器)

      1、安裝NVIDIA驅動 2、安裝docker&#xff0c;docker compose 3、安裝NVIDIA Container Toolkit Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit&#xff08;僅 GPU 場景需要&#xff09; # Configure the production repository: curl -fsSL https://…

      實習手記:基于大模型的搜索引擎開發實踐

      初入團隊&#xff1a;從理論到實踐的跨越五月份開始&#xff0c;我懷著忐忑又期待的心情以線上的方式加入了公司AI研發中心的搜索引擎優化小組。作為一名數據科學與大數據技術專業的學生&#xff0c;這是我第一次參與工業級AI項目的開發&#xff0c;團隊的任務是構建一個基于大…

      用Python實現神經網絡(二)

      #Overfitting是機器學習的主要問題。下面我們來看一下過擬合現像&#xff1a;import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplimport tensorflow as tffrom scipy.optimize import curve_fit# Generic matplotlib parameters for plots and figure…

      數據結構入門 (二):掙脫連續空間的束縛 —— 單向鏈表詳解

      TOC(目錄) 引言&#xff1a;整齊的代價 在上一篇文章中&#xff0c;我們一起探索了數據結構大家族的第一位成員——順序表。我們了解到&#xff0c;順序表作為一種線性結構&#xff0c;其最大的特點在于邏輯順序與物理順序的一致性&#xff0c;即元素之間不僅存在邏輯上的前后關…

      AI-視頻一致性與多幀控制在AIGC中的技術挑戰與突破!

      全文目錄&#xff1a;開篇語前言1. 視頻中人物一致性建模的難點與現有解決方案**人物一致性建模的挑戰****現有解決方案****案例代碼&#xff1a;基于姿態估計的多幀一致性保持**2. 光照/紋理/姿態跨幀保持方法剖析**跨幀光照與紋理一致性****跨幀姿態一致性**3. 幀間插值與關鍵…