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

SpringBoot 整合 WebSocket 进阶——在线用户、群聊、私聊

上一篇讲了 WebSocket 的基础,这篇实现一个完整的聊天室——在线用户管理、群聊、私聊。

一、在线用户管理

@ComponentpublicclassUserSessionManager{privatefinalMap<Long,String>onlineUsers=newConcurrentHashMap<>();privatefinalMap<String,Long>sessionUsers=newConcurrentHashMap<>();publicvoidonline(LonguserId,StringsessionId){onlineUsers.put(userId,sessionId);sessionUsers.put(sessionId,userId);}publicvoidoffline(StringsessionId){LonguserId=sessionUsers.remove(sessionId);if(userId!=null){onlineUsers.remove(userId);}}publicintonlineCount(){returnonlineUsers.size();}publicList<Long>allUserIds(){returnnewArrayList<>(onlineUsers.keySet());}publicbooleanisOnline(LonguserId){returnonlineUsers.containsKey(userId);}}

二、WebSocket 处理器

@ComponentpublicclassChatWebSocketHandlerextendsTextWebSocketHandler{privatefinalUserSessionManagersessionManager;privatefinalSimpMessagingTemplatemessagingTemplate;@AutowiredpublicChatWebSocketHandler(UserSessionManagersm,SimpMessagingTemplatemt){this.sessionManager=sm;this.messagingTemplate=mt;}@OverridepublicvoidafterConnectionEstablished(WebSocketSessionsession){LonguserId=getUserIdFromSession(session);sessionManager.online(userId,session.getId());broadcast("系统",userId+" 上线了,当前在线 "+sessionManager.onlineCount()+" 人");}@OverrideprotectedvoidhandleTextMessage(WebSocketSessionsession,TextMessagemessage){LonguserId=getUserIdFromSession(session);Stringpayload=message.getPayload();ChatMessagemsg=JSON.parseObject(payload,ChatMessage.class);if(msg.getToUserId()==null){// 群聊:广播给所有在线用户messagingTemplate.convertAndSend("/topic/chat",Map.of("from",userId,"content",msg.getContent()));}else{// 私聊:只发给指定用户messagingTemplate.convertAndSendToUser(msg.getToUserId().toString(),"/queue/chat",Map.of("from",userId,"content",msg.getContent()));}}@OverridepublicvoidafterConnectionClosed(WebSocketSessionsession,CloseStatusstatus){LonguserId=getUserIdFromSession(session);sessionManager.offline(session.getId());broadcast("系统",userId+" 下线了");}}

三、前端聊天界面

<script>// 连接varsocket=newWebSocket('ws://localhost:9090/chat');socket.onopen=function(){console.log('连接成功');};// 接收消息socket.onmessage=function(event){varmsg=JSON.parse(event.data);addMessage(msg);};// 发送群聊functionsendGroup(){socket.send(JSON.stringify({content:document.getElementById('input').value}));}// 发送私聊functionsendPrivate(toUserId){socket.send(JSON.stringify({toUserId:toUserId,content:document.getElementById('input').value}));}</script>

四、在线人数统计

@RestController@RequestMapping("/api/chat")publicclassChatController{@AutowiredprivateUserSessionManagersessionManager;@GetMapping("/online-count")publicResultVO<Integer>onlineCount(){returnResultVO.success(sessionManager.onlineCount());}}

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/MySQL 实战干货,不让你白来。

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

相关文章:

  • 揭秘会员制网站 建设 的核心逻辑与运营闭环,打造高粘性付费社区
  • Shader魔法揭秘:3D画面背后的神奇代码
  • 2026 年新发布:西湖正规的变频控制柜厂家哪家可靠,工厂节电30%的秘密,居然藏在这台不起眼的小设备里! - 企业官方推荐【认证】
  • 线上考试环境检测工具设计与实现全解析
  • Java List转String性能优化与最佳实践:从线上告警到七种方案深度解析
  • 2026床垫厂推荐零套路避坑指南,价格透明口碑实力测评不踩雷 - 工业设备
  • C++算法模拟器:用贪心、BFS、DP实现游戏角色AI对抗
  • Docker Compose核心命令全解析与实战指南:从入门到精通
  • BiliTools完整指南:免费跨平台B站资源下载工具终极教程
  • LoRA微调技术实战:基于Stable Diffusion 2.0打造“小动物踢足球”AI绘画模型
  • 2026 年现阶段彬县知名的加固注浆套管销售厂家怎么联系,你以为老旧建筑补牢全靠混凝土?这玩意儿能把地基缝焊成铁骨! - 品质体验官
  • Unity3D物体点击检测:射线、事件与OnMouseDown方案全解析
  • 英飞凌3D磁力传感器TLV493D应用指南:从原理到角度与位置检测实践
  • MetaGPT | 第二十二章:常见问题解答与学习资源推荐
  • USB Audio Class 1.0规范约束下BP-8913的音频格式协商机制与抖动容限
  • USB HID设备配置实战:从报告描述符到复合设备开发
  • Spring @Autowired 属性注入 vs. 方法注入:原理、差异与最佳实践
  • 从传统仓到AI仓的生死跃迁:3家上市企业转型失败复盘 vs 2家盈利翻倍案例全对比(含原始数据看板)
  • LoRa技术全解析:从物联网通信到AI大模型微调实战指南
  • 从咒语到工程:掌握五大结构化Prompt技巧,高效驾驭大语言模型
  • 试了那么多AI工具,为什么活还是干不完?
  • 鸿蒙ArkTS状态管理:@State、@Observed与@ObjectLink实战解析
  • 数字人视频完播率提升320%的关键设置,剪映Pro 4.2.1隐藏功能全曝光
  • 【# 07B — 交易者的情绪管理】
  • AI对话恢复功能解析:从原理到实践,实现智能体对话无缝续接
  • 中医AI辅助辨证:一例阳虚兼气血亏虚病案解析
  • Go程序防破解实战:从编译优化到代码混淆的工程实践
  • 魔法水晶Shader全解析:从呼吸到发光
  • 虚拟机CPU超配问题解析:从超量分配到性能调优的实战指南
  • UnityLive2DExtractor:从AssetBundle无损提取Live2D Cubism 3模型资源