From 559f070ad00a82ccbff884c0192729f4fee74525 Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期三, 28 五月 2025 11:39:53 +0800
Subject: [PATCH] 接受websocket并定时检测连接状态及重连

---
 src/main/java/com/whyc/webSocket/receiver/WebSocketClientService.java     |   56 ++++++++++++++++++
 src/main/java/com/whyc/webSocket/receiver/WebSocketClientConfig.java      |   22 +++++++
 src/main/java/com/whyc/webSocket/receiver/ThirdPartyWebSocketHandler.java |   45 +++++++++++++++
 3 files changed, 123 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/whyc/webSocket/receiver/ThirdPartyWebSocketHandler.java b/src/main/java/com/whyc/webSocket/receiver/ThirdPartyWebSocketHandler.java
new file mode 100644
index 0000000..37f3bc3
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/receiver/ThirdPartyWebSocketHandler.java
@@ -0,0 +1,45 @@
+package com.whyc.webSocket.receiver;
+
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketHttpHeaders;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ThirdPartyWebSocketHandler extends TextWebSocketHandler {
+
+    private static final Logger log = LoggerFactory.getLogger(ThirdPartyWebSocketHandler.class);
+    private WebSocketSession session;
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) {
+        this.session = session;
+        log.info("WebSocket connection established.");
+    }
+
+    @Override
+    public void handleTextMessage(WebSocketSession session, TextMessage message) {
+        log.info("Received message: {}", message.getPayload());
+        // 鍙互鍦ㄨ繖閲屽仛涓氬姟澶勭悊锛屾瘮濡傚彂甯冧簨浠躲�佸瓨鍏ラ槦鍒楃瓑
+        String jsonStr = message.getPayload();
+
+    }
+
+    @Override
+    public void handleTransportError(WebSocketSession session, Throwable exception) {
+        log.error("Transport error occurred.", exception);
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+        log.info("WebSocket connection closed: {}", status);
+        this.session = null;
+    }
+
+    public WebSocketSession getSession() {
+        return session;
+    }
+}
+
diff --git a/src/main/java/com/whyc/webSocket/receiver/WebSocketClientConfig.java b/src/main/java/com/whyc/webSocket/receiver/WebSocketClientConfig.java
new file mode 100644
index 0000000..f30ecae
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/receiver/WebSocketClientConfig.java
@@ -0,0 +1,22 @@
+package com.whyc.webSocket.receiver;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.client.standard.StandardWebSocketClient;
+import org.springframework.web.socket.WebSocketHttpHeaders;
+import org.springframework.web.socket.sockjs.client.SockJsClient;
+import org.springframework.web.socket.sockjs.client.Transport;
+import org.springframework.web.socket.sockjs.client.WebSocketTransport;
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class WebSocketClientConfig {
+
+    @Bean
+    public ThirdPartyWebSocketHandler thirdPartyWebSocketHandler() {
+        return new ThirdPartyWebSocketHandler();
+    }
+
+}
+
diff --git a/src/main/java/com/whyc/webSocket/receiver/WebSocketClientService.java b/src/main/java/com/whyc/webSocket/receiver/WebSocketClientService.java
new file mode 100644
index 0000000..76f8a1b
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/receiver/WebSocketClientService.java
@@ -0,0 +1,56 @@
+package com.whyc.webSocket.receiver;
+
+import org.springframework.stereotype.Service;
+import org.springframework.util.concurrent.ListenableFuture;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.client.standard.StandardWebSocketClient;
+import org.springframework.web.socket.WebSocketHttpHeaders;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.annotation.PostConstruct;
+import java.net.URI;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class WebSocketClientService {
+
+    /*@Value("${third.party.websocket.uri}")
+    private String webSocketUri;*/
+
+    @Autowired
+    private ThirdPartyWebSocketHandler handler;
+
+    public WebSocketClientService(ThirdPartyWebSocketHandler handler) {
+        this.handler = handler;
+    }
+
+    private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+
+    @PostConstruct
+    public void connect() {
+        scheduler.scheduleAtFixedRate(() -> {
+            try {
+                //鍒涘缓URI瀵硅薄骞跺皢webSocketUri浼犲叆
+                //String webSocketUri = "ws://localhost:8919/fg/server";
+                String webSocketUri = "ws://localhost:18080/realtime-data";
+                URI  uri = new URI(webSocketUri);
+                System.out.println("webSocketUri:"+webSocketUri);
+                if (handler.getSession() == null || !handler.getSession().isOpen()) {
+                    System.out.println("Connecting to WebSocket server...");
+                    StandardWebSocketClient client = new StandardWebSocketClient();
+                    ListenableFuture<WebSocketSession> future = client.doHandshake(handler, new WebSocketHttpHeaders(), uri);
+                    future.addCallback(session -> {
+                        System.out.println("Connected to WebSocket server.");
+                    }, ex -> {
+                        System.err.println("Failed to connect to WebSocket: " + ex.getMessage());
+                    });
+                }
+            } catch (Exception e) {
+                System.err.println("Unexpected error during connection attempt: " + e.getMessage());
+            }
+        }, 0, 60, TimeUnit.SECONDS); // 姣�60绉掑皾璇曢噸杩炰竴娆�
+    }
+}
+

--
Gitblit v1.9.1