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<String, WebSocketSession> 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));
|
}
|
}
|
|
|
}
|