当前位置: 首页 > news >正文

企业级Websocket即时通讯系统

企业级即时通讯系统实现总结

项目概述

基于Vue 3 (JavaScript)+Spring Boot构建的实时聊天系统,采用 WebSocket (STOMP) 协议实现消息推送。

功能特性

  • 公共频道:所有在线用户可见的广播消息
  • 私人聊天:一对一加密消息通信
  • 在线状态:实时显示用户在线/离线状态
  • 消息提醒:页面后台时标题闪烁提示

核心依赖

前端依赖(package.json)

依赖版本用途
vue^3.5.24前端框架
element-plus^2.11.7UI组件库
pinia^3.0.4状态管理
sockjs-client^1.6.1WebSocket封装
stompjs2.3.3STOMP协议客户端

后端依赖(pom.xml)

依赖版本用途
spring-boot-starter-parent2.3.10.RELEASESpring Boot父工程
spring-boot-starter-websocket-WebSocket支持
hutool-all5.8.41工具库
mybatis-plus-boot-starter3.5.6ORM框架
sa-token-spring-boot-starter1.37.0权限认证

核心技术实现

1. 前端实现

消息存储结构

constpublicMessages=ref([]);// 公共消息列表constprivateMessages=ref({});// 私人消息(按用户ID存储)

STOMP 连接

constsocket=newSockJS('/stomp');conststompClient=Stomp.over(socket);stompClient.connect({'token':token},(frame)=>{console.log('STOMP 连接成功');});

频道订阅

  • 公共频道:/topic/public(广播模式)
  • 私人频道:/user/{userId}/queue/private(点对点)

2. 后端实现

WebSocket 配置

@Configuration@EnableWebSocketMessageBrokerpublicclassWebSocketConfigimplementsWebSocketMessageBrokerConfigurer{@OverridepublicvoidconfigureMessageBroker(MessageBrokerRegistryconfig){config.enableSimpleBroker("/topic","/queue","/user");config.setApplicationDestinationPrefixes("/app");}@OverridepublicvoidregisterStompEndpoints(StompEndpointRegistryregistry){registry.addEndpoint("/stomp")// 添加 STOMP 端点.setHandshakeHandler(newWebSocketHandshakeHandler())// 设置握手处理程序.setAllowedOrigins("*")// 允许所有来源.withSockJS();// 开启 SockJS 支持}}

自定义WebSocket握手处理类

用于处理WebSocket连接的握手请求,将用户ID绑定到WebSocket会话中

@Component@Slf4jpublicclassWebSocketHandshakeHandlerextendsDefaultHandshakeHandler{@OverrideprotectedPrincipaldetermineUser(ServerHttpRequestrequest,WebSocketHandlerwsHandler,Map<String,Object>attributes){StringuserId=StpUtil.getLoginIdAsString();returnnewStompPrincipal(userId);}}

ws用户信息封装

/** * ws用户信息封装 * * @author Chen * @since 2026-5-9 11:05 */publicclassStompPrincipalimplementsPrincipal{// 用户IDprivatefinalStringname;publicStompPrincipal(Stringname){this.name=name;}@OverridepublicStringgetName(){returnname;}}

消息处理

@MessageMapping(“/chat/public”)类型GetMapping,websocket的请求映射

//前端调用constdestination=currentChannel.value==='public'?'/app/chat/public':`/app/chat/private/${selectedUser.value.id}`;client.send(destination,{},JSON.stringify({content:newMessage.CONTENT,fromUserId:userInfoStore.userId,toUserId:selectedUser.value?.id,msgType:'text',channelType:currentChannel.value}));

@SendTo(“/topic/public”)注解是将返回结果自动广播到主题:/topic/public;也可以手动广播

//手动发送消息到指定用户队列messagingTemplate.convertAndSendToUser(toUserId,"/queue/private",response);
@MessageMapping("/chat/public")@SendTo("/topic/public")publicChatResDTOsendPublicMessage(ChatMessageDTOmessage){returnchatService.processPublicMessage(message);}@MessageMapping("/chat/private/{toUserId}")publicvoidsendPrivateMessage(ChatMessageDTOmessage){chatService.processPrivateMessage(message,message.getToUserId());}

消息持久化

  • 公共消息:GROUP_ID = 'public'
  • 私人消息:GROUP_ID = 'private',记录双方用户ID

技术架构

┌─────────────────────────────────────────────────┐ │ 前端 (Vue 3) │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 侧边栏 │ │ 聊天面板 │ │ 输入框 │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ └───────┼────────────┼────────────┼─────────────┘ │ WebSocket │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────────────┐ │ 后端 (Spring Boot) │ │ ChatController → ChatService → STOMP Broker │ └───────────────────────────────┬───────────────┘ │ JDBC ▼ ┌─────────────────────────────────────────────────┐ │ 数据库 (MySQL) │ │ CHAT_MESSAGE 表 │ └─────────────────────────────────────────────────┘

技术栈

分类技术
前端Vue 3、Pinia、Element Plus
通信SockJS、STOMP
后端Spring Boot
数据库MySQL、Hutool DB

总结

本系统实现了企业级即时通讯的核心功能:

  1. 实时通信:基于 STOMP 协议的毫秒级消息推送
  2. 双频道模式:公共广播 + 私人聊天
  3. 在线状态:实时同步在线用户列表
  4. 消息持久化:所有消息记录到数据库
  5. 用户体验:未读计数、后台提醒等功能

代码结构清晰,易于扩展文件传输、表情等高级功能。

http://www.jsqmd.com/news/856719/

相关文章:

  • 别再为OnlyOffice中文排版发愁了!Docker版8.0.1字体字号完整配置指南(Ubuntu 22.04)
  • 安卓APP通过JNI调用ATSHA204A加密芯片实战指南
  • 如何评估铜装饰加工厂哪家合作案例多、更值得选? - myqiye
  • 如何用3个关键技巧将罗技鼠标宏变成PUBG压枪神器
  • BabelDOC:学术论文翻译的革命性工具,让复杂PDF格式完美保留
  • 别再硬算公式了!用MATLAB脚本一键搞定三相并网逆变器LCL滤波器设计
  • 线程之多线程函数
  • 嵌入式异构多处理器评估板:从核心原理到工业应用实战
  • 分享高效牧草种子生产厂,适合青贮制作的优质厂家 - myqiye
  • logitech-pubg项目完整指南:罗技鼠标宏绝地求生压枪终极方案
  • 拆解OpenTSN 3.2:如何用一套硬件逻辑,灵活拼出交换机与网卡?
  • 解锁伯远生物表观遗传学:细胞记忆与命运的抉择
  • 告别踩坑!RocketMQ Dashboard最新版(Spring Boot)打包、配置与启动避坑指南
  • 分享有机溶剂脱水推荐厂家选购指南,九天高科是优质之选 - myqiye
  • UE5.1升级后MetaHuman动不了?手把手教你修复增强输入系统适配问题
  • 掌握AMD Ryzen硬件调试:SMUDebugTool从入门到精通的完整指南
  • ViGEmBus虚拟游戏控制器驱动:5分钟快速上手指南,让你的游戏体验升级!
  • 2026年4月做得好的特种光纤中心推荐,特种光纤/量子科技/探测器,特种光纤厂家选哪家 - 品牌推荐师
  • 销售易NeoAgent 2.0深度解析:从“业务语义本体“到“智能体矩阵“的技术架构
  • Shell脚本应用(一)---Shell脚本入门(基础+理论+实操+实例)-004篇
  • 别再只盯着Mesh了!聊聊NoC拓扑那些被低估的‘冷门’选手:Crossbar、蝶形与Clos网络
  • 不止是UART:深入瑞萨RA_FSP的SCI模块,解锁SPI、I2C和智能卡接口的复用秘籍
  • 性价比高的三维动画设计公司推荐,如何选? - mypinpai
  • ComfyUI Manager插件架构优化:5种高效部署方案与性能调优指南
  • AD导出Gerber文件时,单位选英寸格式选2:5?一文讲透这些‘祖传’设置背后的原因
  • Java中List之间求交集
  • EI会议投稿踩坑记:手把手教你搞定PDF Express字体嵌入和合规邮件(附免费工具)
  • 专业的济南育婴师服务公司
  • 告别环境配置烦恼:用Docker一键部署博流BL616/BL808 RISC-V SDK编译环境(支持Win/Mac/Linux)
  • 5分钟快速清理Windows右键菜单:ContextMenuManager终极优化指南