WebSocket實時通信系統——js技能提升

2. WebSocket實時通信系統

功能概述

實現完整的WebSocket通信系統,支持實時消息推送、連接管理、心跳檢測和自動重連。

技術難點

  • WebSocket連接生命周期管理
  • 消息序列化和反序列化
  • 心跳機制和連接保活
  • 錯誤處理和重連策略
  • 多組件狀態同步

實現思路

2.1 WebSocket管理器
// src/utils/websocket.ts
export interface WebSocketOptions {url: stringonConnect?: () => voidonDisconnect?: () => voidonMessage?: (message: any) => voidonError?: (error: any) => void
}export class WebSocketManager {private ws: WebSocket | null = nullprivate options: WebSocketOptionsprivate reconnectAttempts = 0private maxReconnectAttempts = 5private reconnectInterval = 1000private heartbeatInterval: NodeJS.Timeout | null = nullconstructor(options: WebSocketOptions) {this.options = options}// 連接WebSocketconnect(): Promise<void> {return new Promise((resolve, reject) => {try {this.ws = new WebSocket(this.options.url)this.ws.onopen = () => {console.log('? WebSocket 連接成功')this.reconnectAttempts = 0this.startHeartbeat()this.options.onConnect?.()resolve()}this.ws.onclose = (event) => {console.log('🔌 WebSocket 連接斷開:', event.code, event.reason)this.stopHeartbeat()this.options.onDisconnect?.()// 自動重連邏輯if (this.reconnectAttempts < this.maxReconnectAttempts) {this.reconnectAttempts++setTimeout(() => {this.connect().catch(console.error)}, this.reconnectInterval * this.reconnectAttempts)}}this.ws.onerror = error => {console.error('? WebSocket 錯誤:', error)this.options.onError?.(error)reject(error)}this.ws.onmessage = event => {try {const data = JSON.parse(event.data)this.options.onMessage?.(data)} catch (err) {console.warn('? 消息解析失敗:', event.data)this.options.onMessage?.(event.data)}}} catch (error) {console.error('? WebSocket 連接失敗:', error)reject(error)}})}// 發送消息send(data: any): void {if (this.ws && this.ws.readyState === WebSocket.OPEN) {const message = typeof data === 'string' ? data : JSON.stringify(data)this.ws.send(message)} else {throw new Error('WebSocket未連接')}}// 心跳機制private startHeartbeat(): void {this.heartbeatInterval = setInterval(() => {if (this.ws && this.ws.readyState === WebSocket.OPEN) {this.send({ type: 'heartbeat', timestamp: Date.now() })}}, 30000) // 30秒發送一次心跳}private stopHeartbeat(): void {if (this.heartbeatInterval) {clearInterval(this.heartbeatInterval)this.heartbeatInterval = null}}// 斷開連接disconnect(): void {this.stopHeartbeat()if (this.ws) {this.ws.close()this.ws = null}}// 獲取連接狀態get isConnected(): boolean {return this.ws?.readyState === WebSocket.OPEN}
}
2.2 Vue組合式API封裝
// src/hooks/useWebSocket.ts
export function useWebSocket(options: WSOptions) {const socketManager = ref<WebSocketManager | null>(null)const isConnected = ref(false)const connect = async (params?: WSOptions) => {if (!useCookie('token').value) returnconst innerParams = params || optionssocketManager.value = createWebSocketManager(typeof innerParams === 'function' ? innerParams() : innerParams)try {await socketManager.value?.connect()isConnected.value = true// 設置斷開連接回調socketManager.value?.setDisconnectCallback(() => {isConnected.value = falseconst { message } = useGlobalComponent()message.error('網絡連接斷開,請刷新頁面')})} catch (error) {console.error('WebSocket連接失敗:', error)isConnected.value = false}}// 發送消息const sendMessage = <T>(data: T) => {if (!socketManager.value?.isConnected) {const { message } = useGlobalComponent()message.error('網絡連接斷開,請刷新頁面')return}socketManager.value?.send(data)}const disconnect = () => {socketManager.value?.disconnect()isConnected.value = false}onUnmounted(disconnect)return {sendMessage,connect,disconnect,isConnected: () => isConnected.value,}
}
2.3 聊天狀態管理集成
// src/stores/chat/methods.ts
export const useChatStore = defineStore('chat', () => {const { sendMessage, connect, disconnect, isConnected } = useWebSocket(() => ({url: `ws://192.168.201.201:8088/api/websocket?token=${useCookie('token').value}`,onMessage: msg => {if (msg.event_id !== state.list[state.list.length - 1]?.event_id) returnstate.list = onMessage(msg, state.list)if (state.isFirst &&[NotificationType.FINISH, NotificationType.END].includes(msg?.data?.type)) {getChatSummary(msg.data.session_id).then(res => {state.title = resstate.isFirst = false})}},}))const send = (data: string, id: number) => {const lastMsg = state.list[state.list.length - 1]let callerInstanceId = ''if (lastMsg && 'caller' in lastMsg) {callerInstanceId = (lastMsg?.caller as { instance_id: string })?.instance_id}const msg = createUserMessage(data, id, callerInstanceId)const question = createResponseMessage(data, id, callerInstanceId)if (state.list.length) {if (state.list[state.list.length - 1]?.session_id === id) {state.list = [...state.list, question]} else {state.list = [question]state.isFirst = true}} else {state.list = [question]state.isFirst = true}sendMessage(msg)return question}return {send,isConnected,}
})

關鍵技術點

  1. 連接管理: 完整的連接生命周期管理
  2. 自動重連: 指數退避重連策略
  3. 心跳機制: 保持連接活躍狀態
  4. 錯誤處理: 完善的錯誤捕獲和用戶提示
  5. 狀態同步: 多組件間的連接狀態同步

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

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

相關文章

Spring AI 入門指南:三步將AI集成到Spring Boot應用

無需深入AI底層實現&#xff0c;Java開發者也能快速構建智能應用本文將介紹如何使用 Spring AI 在 Spring Boot 項目中快速集成 AI 能力。通過三步操作——添加依賴、配置 API 憑證和編寫調用代碼&#xff0c;Java 開發者可以輕松構建 AI 應用。一、Spring AI 簡介Spring AI 是…

OOM問題排查思路及解決方案

OOM問題原因&#xff1a; 根本原因是創建的對象數量超過JVM堆內存容量&#xff0c;且這些對象無法被GC回收場景&#xff1a; 1.本地緩存了用戶態&#xff0c;用戶量急劇上升導致內存溢出&#xff0c;如使用HashMap本地緩存10萬用戶數據&#xff0c;每 個用戶對象約2KB&#xf…

梨花教育暖心鵬城:深圳市養老護理院里“時光綻放”,用聲音點亮銀發精神之光

2025年8月24日&#xff0c;在深圳這座充滿活力與夢想的城市&#xff0c;一場溫暖人心的公益活動在深圳市養老護理院溫情上演。梨花教育策劃并組織了“梨花?時光綻放”公益活動&#xff0c;旨在通過聲音的魅力&#xff0c;為市養老護理院的老人們送去關懷與歡樂&#xff0c;豐富…

力扣100+補充大完結

力扣100分類一、Java基礎代碼模板1. 基礎輸入輸出模板import java.util.Scanner;class Solution {public static int linkedListOperation() {// 鏈表操作實現return 0;}public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.next…

SSM從入門到實戰:3.3 SpringMVC數據綁定與驗證

&#x1f44b; 大家好&#xff0c;我是 阿問學長&#xff01;專注于分享優質開源項目解析、畢業設計項目指導支持、幼小初高的教輔資料推薦等&#xff0c;歡迎關注交流&#xff01;&#x1f680; &#x1f4d6; 本文概述 本文是SSM框架系列SpringMVC基礎篇的第三篇&#xff0…

ctfshow_萌新web16-web20-----文件包含日志注入

_萌新web16解開md5?c36d_萌新web17-----文件包含禁用了php關鍵字&#xff0c;這個題禁了遠程文件包含,進行日志注入發現日志中有user-agent信息&#xff0c;因此我們可以在user-agent中寫入木馬抓包burpsuitUser-agent:<?php eval($_POST[cmd])?>抓包然后連接蟻劍_萌新…

Flink的CheckPoint與SavePoint

Flink的Checkpoint&#xff08;檢查點&#xff09;和Savepoint&#xff08;保存點&#xff09;是兩種不同的狀態快照機制&#xff0c;主要區別如下&#xff1a;1. ?Checkpoint??核心功能?&#xff1a;周期性觸發的容錯機制&#xff0c;用于故障恢復時保證狀態一致性57。?觸…

Ansible 自動化運維工具:介紹與完整部署(RHEL 9)

Ansible 自動化運維工具&#xff1a;介紹與完整部署&#xff08;RHEL 9&#xff09;Ansible 的介紹與安裝 一、自動化運維的必要性 傳統手動運維依賴圖形/命令行界面、檢查清單或記憶執行任務&#xff0c;存在以下核心問題&#xff1a; 易出錯&#xff1a;易跳過步驟或執行錯誤…

構建生產級 RAG 系統:從數據處理到智能體(Agent)的全流程深度解析

文章目錄一、 整體架構設計&#xff1a;邁向智能體&#xff08;Agent&#xff09;驅動的 RAG二、 數據準備與預處理&#xff1a;構建高質量知識庫2.1 數據加載與初步提取2.2 多策略分塊 (Multi-Strategy Chunking)邏輯分塊&#xff1a;按故障章節和關鍵說明傳統分塊&#xff1a…

Duplicate Same Files Searcher v10.7.0,秒掃全盤重復檔,符號鏈接一鍵瘦身

[軟件名稱]: Duplicate Same Files Searcher v10.7.0 [軟件大小]: 3.3 MB [軟件大小]: 夸克網盤 | 百度網盤 軟件介紹 Duplicate Same Files Searcher&#xff08;重復文件搜索&#xff09;是一款強大且專業的重復文件查找與清理工具。通過使用該軟件&#xff0c;用戶可以方…

C/C++ 數據結構 —— 樹(2)

? &#x1f381;個人主頁&#xff1a;工藤新一 ? &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; ? &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 ? &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章…

EEA架構介紹

前言 本文主要對EEA架構的理解進行了記錄&#xff0c;以加深理解及方便后續查漏補缺。 EEA架構 硬件架構 EEA架構作用 提升算力利用率、數據統一交互&#xff0c;實現整車功能協同、縮短線束、降低重量、降低故障率、提升裝配自動化 EEA架構發展趨勢 分布式–>域集中式–>…

【目標跟蹤】《FastTracker: Real-Time and Accurate Visual Tracking》論文閱讀筆記

0.參考 論文:https://arxiv.org/pdf/2508.14370v1 代碼:github.com/HamidrezaHashempoor/FastTracker, huggingface.co/datasets/HamidrezaHashemp/FastTracker-Benchmark. 1.摘要 提高多目標跟蹤在多物體跟蹤上的性能(從前主要是針對行人場景做的優化)。 該方法包含兩…

C++ 內存安全與智能指針深度解析

C 內存安全與智能指針深度解析面試官考察“野指針”&#xff0c;實際上是在考察你對 C “資源所有權” (Ownership) 和 “生命周期管理” (Lifetime Management) 的理解。現代 C 的答案不是“如何手動避免”&#xff0c;而是“如何自動化管理”。第一部分&#xff1a;核心知識點…

Vue SFC Playground 如何正確引入 naive-ui

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

音頻轉文本技術詳解:API接口、實用示例與最佳實踐

音頻轉文本技術詳解&#xff1a;API接口、實用示例與最佳實踐 目錄 概述接口類型與模型說明支持的音頻格式與文件大小限制快速入門音頻轉錄&#xff08;Transcription&#xff09;音頻翻譯&#xff08;Translation&#xff09;支持的語言列表時間戳功能處理較長音頻上下文提示…

QT-布局管理器

Qt布局管理器 一、布局管理器介紹布局管理器&#xff08;Layout Manager&#xff09;是在圖形用戶界面&#xff08;GUI&#xff09;應用程序中用于自動管理和排列窗口部件&#xff08;Widget&#xff09;的工具。Qt 共提供了 5 種布局管理器&#xff0c;來幫助開發者方便地組織…

Linux CentOS 安裝 .net core 3.1

打開終端&#xff0c;輸入以下命令以添加 .NET Core Yum 倉庫&#xff1a;sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm安裝 .NET Core SDK&#xff1a;sudo yum install dotnet-sdk-3.1驗證安裝&#xff1a;dotnet --versionre…

深度剖析Spring AI源碼(三):ChatClient詳解,優雅的流式API設計

深度剖析Spring AI源碼&#xff08;三&#xff09;&#xff1a;ChatClient詳解&#xff0c;優雅的流式API設計“The best APIs are those that make simple things simple and complex things possible.” —— Alan Kay (計算機科學巨匠) Spring AI的ChatClient API正是這句話…

C語言基礎:(二十五)預處理詳解

目錄 前言 一、預處理符號 二、#define 定義常量 三、#define 定義宏 四、帶有副作用的宏參數 五、宏替換的規則 六、宏函數對比 七、# 和 ## 7.1 #運算符 7.2 ##運算符 八、命名約定 九、#undef 十、命令行定義 十一、條件編譯 十二、頭文件的包含 12.1 頭…