liujie
2026-01-28 72189753cd1a791a8d90aad34c5bcc165143bf49
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package com.ruoyi.web.controller.webSocket;
 
import lombok.extern.slf4j.Slf4j;
 
import java.net.URI;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
 
/**
 * 简单的WebSocket客户端实现
 * 用于测试WebSocket服务端功能
 */
@Slf4j
public class SimpleWebSocketClient implements WebSocketClientTest.WebSocketClient {
    
    private final String serverUrl;
    private final WebSocketClientTest.WebSocketClient.MessageHandler messageHandler;
    private WebSocketConnection connection;
    private volatile boolean connected = false;
    
    public SimpleWebSocketClient(String serverUrl, WebSocketClientTest.WebSocketClient.MessageHandler messageHandler) {
        this.serverUrl = serverUrl;
        this.messageHandler = messageHandler;
    }
    
    @Override
    public void connect() throws Exception {
        log.info("正在连接到WebSocket服务器: {}", serverUrl);
        
        // 这里使用模拟的WebSocket连接
        // 在实际项目中,您可以使用Java-WebSocket库或其他WebSocket客户端库
        connection = new WebSocketConnection(serverUrl, messageHandler);
        connection.connect();
        
        // 等待连接建立
        int retryCount = 0;
        while (!connected && retryCount < 10) {
            Thread.sleep(500);
            retryCount++;
        }
        
        if (!connected) {
            throw new RuntimeException("连接WebSocket服务器超时");
        }
    }
    
    @Override
    public void send(String message) {
        if (connection != null && connected) {
            connection.send(message);
        } else {
            log.warn("WebSocket未连接,无法发送消息: {}", message);
        }
    }
    
    @Override
    public void close() {
        if (connection != null) {
            connection.close();
            connected = false;
        }
    }
    
    /**
     * 模拟的WebSocket连接类
     */
    private static class WebSocketConnection {
        private final String serverUrl;
        private final WebSocketClientTest.WebSocketClient.MessageHandler messageHandler;
        private volatile boolean isConnected = false;
        
        public WebSocketConnection(String serverUrl, WebSocketClientTest.WebSocketClient.MessageHandler messageHandler) {
            this.serverUrl = serverUrl;
            this.messageHandler = messageHandler;
        }
        
        public void connect() {
            // 模拟连接过程
            new Thread(() -> {
                try {
                    Thread.sleep(1000); // 模拟连接延迟
                    isConnected = true;
                    log.info("WebSocket连接已建立");
                    messageHandler.onOpen();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    messageHandler.onError(e);
                }
            }).start();
        }
        
        public void send(String message) {
            if (isConnected) {
                log.info("发送消息: {}", message);
                // 模拟服务器响应
                simulateServerResponse(message);
            }
        }
        
        public void close() {
            isConnected = false;
            log.info("WebSocket连接已关闭");
            messageHandler.onClose(1000, "正常关闭");
        }
        
        /**
         * 模拟服务器响应
         */
        private void simulateServerResponse(String message) {
            new Thread(() -> {
                try {
                    Thread.sleep(100); // 模拟网络延迟
                    
                    // 解析消息类型并模拟响应
                    if (message.contains("\"type\":\"auth\"")) {
                        if (message.contains("\"token\"")) {
                            // 有token的认证响应
                            String response = "{\"type\":\"auth_success\",\"appUserId\":\"test-user-001\",\"nickName\":\"测试用户\",\"message\":\"认证成功\",\"timestamp\":\"" + 
                                           java.time.LocalDateTime.now() + "\"}";
                            messageHandler.onMessage(response);
                        } else {
                            // 无token的认证响应
                            String response = "{\"type\":\"auth_success\",\"appUserId\":\"test-user-001\",\"nickName\":\"测试用户\",\"message\":\"认证成功(无Token)\",\"timestamp\":\"" + 
                                           java.time.LocalDateTime.now() + "\"}";
                            messageHandler.onMessage(response);
                        }
                    } else if (message.contains("\"type\":\"ping\"")) {
                        // 心跳响应
                        String response = "{\"type\":\"pong\",\"appUserId\":\"test-user-001\",\"timestamp\":\"" + 
                                       java.time.LocalDateTime.now() + "\"}";
                        messageHandler.onMessage(response);
                    } else if (message.contains("\"type\":\"business\"")) {
                        // 业务消息响应
                        String response = "{\"type\":\"message_response\",\"appUserId\":\"test-user-001\",\"originalMessage\":" + 
                                       message + ",\"serverTime\":\"" + java.time.LocalDateTime.now() + "\"}";
                        messageHandler.onMessage(response);
                    }
                } catch (Exception e) {
                    messageHandler.onError(e);
                }
            }).start();
        }
    }
}