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