package com.ruoyi.web.controller.hanler; import com.fasterxml.jackson.databind.ObjectMapper; import com.smartor.domain.SocketMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.AbstractWebSocketHandler; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Slf4j @Component public class ChatWebSocketHandler extends AbstractWebSocketHandler { // 用于存储用户ID和WebSocketSession的映射关系 private static Map sessions = new ConcurrentHashMap<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 获取用户ID,可以从session中获取或者通过其他方式获取 String userId = extractUserId(session); // 将用户ID和WebSocketSession存储到映射表中 sessions.put(userId, session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 处理收到的消息 String userId = extractUserId(session); String payload = message.getPayload().toString(); log.info("-----------------:{}", payload); // 解析消息类型 ObjectMapper mapper = new ObjectMapper(); SocketMessage parsedMessage = mapper.readValue(payload, SocketMessage.class); if (parsedMessage != null) { sendMessageToUser(parsedMessage.getUserId(), parsedMessage.getContent()); } } @Override protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { log.info("发送二进制"); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { // 关闭连接时,从映射表中移除对应的用户ID和WebSocketSession String userId = extractUserId(session); sessions.remove(userId); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // 处理传输错误,例如连接断开或发生异常 String userId = extractUserId(session); sessions.remove(userId); } @Override public boolean supportsPartialMessages() { // 支持部分消息处理 return false; } private String extractUserId(WebSocketSession session) { // 在实际情况下,你可以根据需要从session中提取用户ID,可以直接拿当前登际人的userId String userId = session.getUri().getQuery().split("=")[1]; // return session.getAttributes().get("userId").toString(); return userId; } private void sendMessageToUser(String userId, String message) throws IOException { WebSocketSession session = sessions.get(userId); if (session != null && session.isOpen()) { session.sendMessage(new TextMessage(message)); } } }