当前位置: 首页 > 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.gsyq.cn/news/1337355.html

相关文章:

  • MATLAB新手也能搞定:手把手教你搭建OFDM-QPSK通信链路仿真(附完整代码和星座图分析)
  • VSCode+GCC+OpenOCD:打造你的STM32专属OpenHarmony 3.1开发流水线
  • 解锁伯远生物表观遗传学:细胞记忆与命运的抉择
  • logitech-pubg项目完整指南:罗技鼠标宏绝地求生压枪终极方案
  • 2026年4月做得好的特种光纤中心推荐,特种光纤/量子科技/探测器,特种光纤厂家选哪家 - 品牌推荐师
  • 5分钟快速清理Windows右键菜单:ContextMenuManager终极优化指南
  • 嵌入式异构多处理器评估板:从核心原理到工业应用实战
  • 安卓APP通过JNI调用ATSHA204A加密芯片实战指南
  • VSCode Log Viewer插件进阶:除了看syslog,还能这样监控你的Nginx/Docker应用日志
  • 如何提升区域科技创新服务效率与资源整合能力?
  • Modon与Montage Hotels Resorts合作在埃及拉斯伊尔赫克马引入超豪华酒店品牌
  • DeepSeek API接入必须知道的5个隐藏参数:temperature=0.3只是开始,context_window_max才是性能分水岭
  • csp信奥赛C++高频考点专项训练之前缀和差分 --【二维前缀和】:最大加权矩形
  • AD导出Gerber文件时,单位选英寸格式选2:5?一文讲透这些‘祖传’设置背后的原因
  • 汽车模具热流道性价比高的商家 - mypinpai
  • 一文理解软件开发中的“设计模式”
  • Blender新手必看:别再乱点右上角那个“漏斗”了,详解大纲视图的4个隐藏开关
  • 别再让音频信号忽大忽小:手把手教你用运放和模拟乘法器设计一个更现代的AGC模块
  • Windows右键菜单终极清理指南:告别臃肿,重获清爽体验
  • 3分钟掌握B站视频转文字:bili2text完整指南与效率提升方案
  • 5月精选!市面上口碑好的不锈钢离心泵源头厂家推荐分析,不锈钢无负压供水设备/灌溉泵,离心泵直销厂家哪个好 - 品牌推荐师
  • 告别官方镜像:手把手教你用Armbian Build系统为树莓派5定制专属Debian系统
  • 告别SU冲突!雷电模拟器9.0.20+新版Magisk Delta(狐狸面具)保姆级安装避坑指南
  • 别再被‘模糊’搞晕了!用Python模拟SAR距离模糊与方位模糊的直观对比(附代码)
  • 杂木半成品定制厂家哪家好,云松木业口碑出众 - mypinpai
  • 别再死记硬背UML了!用‘航空购票系统’实例,5分钟搞懂对象图到底画什么
  • 从SPEC CPU基准测试看服务器性能调优与国产算力登顶
  • Gemini 3.5 Flash 实测报告:快4倍、编程跑分超自家Pro,这6类场景到底该不该换?
  • 导师不会告诉你的秘密:9款免费AI神器,30分钟生成高信度问卷论文 - 麟书学长
  • ArcGIS Pro 3.0 加载天地图WMTS服务,解决偏移问题的保姆级教程(附最新Key申请流程)