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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 头…