拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

上一篇讲了 WebSocket 的基础这篇实现一个完整的聊天室——在线用户管理、群聊、私聊。一、在线用户管理ComponentpublicclassUserSessionManager{privatefinalMapLong,StringonlineUsersnewConcurrentHashMap();privatefinalMapString,LongsessionUsersnewConcurrentHashMap();publicvoidonline(LonguserId,StringsessionId){onlineUsers.put(userId,sessionId);sessionUsers.put(sessionId,userId);}publicvoidoffline(StringsessionId){LonguserIdsessionUsers.remove(sessionId);if(userId!null){onlineUsers.remove(userId);}}publicintonlineCount(){returnonlineUsers.size();}publicListLongallUserIds(){returnnewArrayList(onlineUsers.keySet());}publicbooleanisOnline(LonguserId){returnonlineUsers.containsKey(userId);}}二、WebSocket 处理器ComponentpublicclassChatWebSocketHandlerextendsTextWebSocketHandler{privatefinalUserSessionManagersessionManager;privatefinalSimpMessagingTemplatemessagingTemplate;AutowiredpublicChatWebSocketHandler(UserSessionManagersm,SimpMessagingTemplatemt){this.sessionManagersm;this.messagingTemplatemt;}OverridepublicvoidafterConnectionEstablished(WebSocketSessionsession){LonguserIdgetUserIdFromSession(session);sessionManager.online(userId,session.getId());broadcast(系统,userId 上线了当前在线 sessionManager.onlineCount() 人);}OverrideprotectedvoidhandleTextMessage(WebSocketSessionsession,TextMessagemessage){LonguserIdgetUserIdFromSession(session);Stringpayloadmessage.getPayload();ChatMessagemsgJSON.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){LonguserIdgetUserIdFromSession(session);sessionManager.offline(session.getId());broadcast(系统,userId 下线了);}}三、前端聊天界面script// 连接varsocketnewWebSocket(ws://localhost:9090/chat);socket.onopenfunction(){console.log(连接成功);};// 接收消息socket.onmessagefunction(event){varmsgJSON.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四、在线人数统计RestControllerRequestMapping(/api/chat)publicclassChatController{AutowiredprivateUserSessionManagersessionManager;GetMapping(/online-count)publicResultVOIntegeronlineCount(){returnResultVO.success(sessionManager.onlineCount());}} 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/MySQL 实战干货不让你白来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门