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

相关文章:

  • 被AI冲击的App,反成了Agent的命门
  • 3分钟快速上手:Hanime1Plugin安卓插件打造纯净动画观影体验终极指南
  • logitech-pubg项目完整指南:罗技鼠标宏绝地求生压枪终极方案
  • 技术分享 | 彻底解决图片“躺平”问题:Java 后端强制校准图片方向
  • 安卓APP通过JNI调用ATSHA204A加密芯片实战指南
  • 销售易NeoAgent 2.0深度解析:从“业务语义本体“到“智能体矩阵“的技术架构
  • 别再让音频信号忽大忽小:手把手教你用运放和模拟乘法器设计一个更现代的AGC模块
  • 为什么很多商城系统,最后都会失控在“规则爆炸”?——真正复杂的,从来不是功能,而是“越来越难控制的业务规则”
  • 深入解析ERC-20:代币标准的基石、演进与未来布局
  • 剪映自动化终极指南:三步告别手动剪辑,拥抱高效创作新时代
  • tars 环境安装及开发部署
  • Seraphine:如何通过智能战绩查询和BP辅助提升英雄联盟竞技体验
  • Claude Code 实战心得:从零构建企业级 Agent 平台的 30 天
  • 从点检到全生命周期:设备管理体系能解决哪些场景痛点?一套设备管理体系的实战应用
  • M10050 模组 陶瓷天线一体
  • Per-Title编码:从固定码率到内容自适应的视频压缩革命
  • 基于SpringBoot+Map的户外徒步路线分享平台毕业设计源码
  • 射频芯片滤波器设计实战:从耦合矩阵理论到GaAs工艺实现
  • 为内部知识库问答机器人接入Taotoken多模型增强能力
  • Seraphine:英雄联盟玩家的终极智能助手,5分钟快速上手教程
  • Linux Crontab 速查手册:5 个问题直击核心语法与常用场景
  • 如何快速提升麻将水平:Akagi智能助手的完整指南
  • 仅限首批500名开发者:Perplexity图谱查询性能压测报告(含17.3万节点实测TPS基准数据)
  • B站SEO优化底层逻辑:以用户需求为核心,解锁低成本流量密码
  • PSRAM与DDR的异同总结
  • 2026年AI辅助研发趋势:智能知识问答如何重塑企业知识库的未来?
  • 影刀RPA跨境店群自动化实战:Python协同Chromium打破风控「垄断」的高并发调度系统架构
  • 开源局域网传输神器!电脑与手机互传文件,扫码即用,还支持实时聊天!
  • 告别繁琐!小鹿管家如何一键破解“千品千面”批量投放难题
  • 团队项目空间、角色继承链、资产水印策略——Midjourney新功能三大硬核模块详解,错过将丧失企业级部署资格