liusheng
2023-07-07 429615c304035bf573297d69ce6a17e086e4f6fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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));
        }
    }
 
 
}