package com.ltkj.web.websocket; import cn.hutool.json.JSONUtil; import com.ltkj.common.core.domain.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; import redis.clients.jedis.util.SafeEncoder; import java.util.ArrayList; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** * @Company: 西安路泰科技有限公司 * @Author: zhaowenxuan * @Date: 2025/6/27 14:59 */ @Slf4j @Component public class WebSockerManager extends TextWebSocketHandler { public final ConcurrentHashMap userSessions = new ConcurrentHashMap<>(); private static final ConcurrentHashMap sessions = new ConcurrentHashMap<>(); private WebSocketClientInfo getUser(WebSocketSession session) { LoginUser loginUser = (LoginUser) session.getAttributes().get("user"); WebSocketClientInfo info = new WebSocketClientInfo(); info.setUid(Long.parseLong(loginUser.getUserId())); info.setHospId(loginUser.getHospName()); return info; // WebSocketClientInfo clientInfo = new WebSocketClientInfo(); // clientInfo.setUid(123L); // clientInfo.setHospId("hosp"); // return clientInfo; } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { WebSocketClientInfo clientInfo = getUser(session); // userSessions.put(clientInfo.getUid(), new ClientSessionInfo(session, clientInfo.getHospId())); sessions.put(session.getId(),clientInfo); ClientSessionInfo sessionInfo = new ClientSessionInfo(); sessionInfo.setSession(session); sessionInfo.setCode(clientInfo.getHospId()); userSessions.put(String.valueOf(clientInfo.getUid()), sessionInfo); session.sendMessage(new TextMessage("连接成功")); log.info("[WebSocket] 在线列表UserIds\n{}",JSONUtil.toJsonStr(new ArrayList<>(userSessions.keySet()))); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); // 处理 ping/pong if ("ping".equals(payload)) { session.sendMessage(new TextMessage("pong")); return; } String sessionId = session.getId(); WebSocketClientInfo clientInfo = sessions.get(sessionId); log.info("[WebSocket] 收到客户端消息 userId:{} msg: {}",clientInfo.getUid(),payload); session.sendMessage(new TextMessage("[WebSocket] 收到客户端消息 msg: " + payload)); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { log.info("[WebSocket] 连接关闭: " + status); WebSocketClientInfo clientInfo = sessions.get(session.getId()); userSessions.remove(String.valueOf(clientInfo.getUid())); } }