尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

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 实战干货不让你白来。
返回列表