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(); } } }