From 7b119de9ee015934f8b001b6038e282522993c80 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期二, 11 二月 2025 11:55:40 +0800
Subject: [PATCH] 远程模块实现websocket基本框架

---
 pipIrr-platform/pom.xml                                                                                            |   11 ++
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(test测试系统).yml                                  |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/config/WebSocketConfig.java         |   19 +++
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(mq民勤系统).yml                                    |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/PipIrrRemoteApplication.java        |    8 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketServer.java    |  131 ++++++++++++++++++++++++++
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(sp沙盘系统).yml                                    |    1 
 pipIrr-platform/pipIrr-web/pom.xml                                                                                 |    5 +
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(166web文件花生壳).yml                               |    1 
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(ym元谋系统).yml                                    |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/pom.xml                                                               |    7 -
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/webUtil/WebSocketMessage.java                            |   33 ++++++
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(mj梅江系统).yml                                    |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketHeartBeat.java |   32 ++++++
 pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml                                            |    1 
 15 files changed, 245 insertions(+), 8 deletions(-)

diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/webUtil/WebSocketMessage.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/webUtil/WebSocketMessage.java
new file mode 100644
index 0000000..87d8cb5
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/webUtil/WebSocketMessage.java
@@ -0,0 +1,33 @@
+package com.dy.common.webUtil;
+
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/2/11 10:41
+ * @Description
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Schema(name="websocket娑堟伅鍩虹被")
+@JsonPropertyOrder({"type", "code", "content"})
+public class WebSocketMessage<T> {
+
+    @Schema(description = "鏁版嵁绫诲瀷")
+    public String type;
+    @Schema(description = "鏁版嵁缂栫爜")
+    public String code;//鏁版嵁缂栫爜锛屽叿浣撴暟鎹叿浣撳畾涔夊叾缂栫爜锛屽彲浠ヤ负绌�
+    @Schema(description = "鏁版嵁")
+    public T content;
+
+    public static final String TYPE_HEARTBEAT = "HEARTBEAT";//蹇冭烦锛屼篃鏄枃鏈暟鎹紝鏁版嵁鍐呭鏄湇鍔$鏃跺埢
+    public static final String TYPE_TEXT = "TEXT";//鏂囨湰鏁版嵁
+    public static final String TYPE_JSON = "JSON";//json鏁版嵁
+}
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml"
index 0473a51..3d97a05 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml"
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mj\346\242\205\346\261\237\347\263\273\347\273\237\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mj\346\242\205\346\261\237\347\263\273\347\273\237\051.yml"
index ac591e0..d43eb8e 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mj\346\242\205\346\261\237\347\263\273\347\273\237\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mj\346\242\205\346\261\237\347\263\273\347\273\237\051.yml"
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mq\346\260\221\345\213\244\347\263\273\347\273\237\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mq\346\260\221\345\213\244\347\263\273\347\273\237\051.yml"
index 7a2ebe1..a8a77a0 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mq\346\260\221\345\213\244\347\263\273\347\273\237\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050mq\346\260\221\345\213\244\347\263\273\347\273\237\051.yml"
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050sp\346\262\231\347\233\230\347\263\273\347\273\237\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050sp\346\262\231\347\233\230\347\263\273\347\273\237\051.yml"
index 85ceb5f..93de14e 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050sp\346\262\231\347\233\230\347\263\273\347\273\237\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050sp\346\262\231\347\233\230\347\263\273\347\273\237\051.yml"
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050test\346\265\213\350\257\225\347\263\273\347\273\237\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050test\346\265\213\350\257\225\347\263\273\347\273\237\051.yml"
index acb24ce..cdaa6e0 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050test\346\265\213\350\257\225\347\263\273\347\273\237\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050test\346\265\213\350\257\225\347\263\273\347\273\237\051.yml"
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050ym\345\205\203\350\260\213\347\263\273\347\273\237\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050ym\345\205\203\350\260\213\347\263\273\347\273\237\051.yml"
index 345cf58..c1cf48a 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050ym\345\205\203\350\260\213\347\263\273\347\273\237\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050ym\345\205\203\350\260\213\347\263\273\347\273\237\051.yml"
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
index 4be4239..f1bcac3 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -348,6 +348,7 @@
         - /sso/sso
         - /remote/comRes/receive
         - /remote/rtuUpgradeStateReceiver/receive
+        - /remote/websocket
         - /wx/comRes/receive
         - /app/captcha/get
         - /file/file #web鍒嗗竷寮忔枃浠剁郴缁�
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/pom.xml b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/pom.xml
index 4bd9060..728d920 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/pom.xml
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/pom.xml
@@ -9,12 +9,7 @@
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>com.dy</groupId>
-            <artifactId>pipIrr-web-sell</artifactId>
-            <version>1.0.0</version>
-            <scope>compile</scope>
-        </dependency>
+
     </dependencies>
 
     <parent>
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/PipIrrRemoteApplication.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/PipIrrRemoteApplication.java
index 0dfe832..e0c3ded 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/PipIrrRemoteApplication.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/PipIrrRemoteApplication.java
@@ -8,7 +8,12 @@
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.context.annotation.FilterType;
 
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
 @SpringBootApplication
+@EnableScheduling //鍚姩瀹氭椂浠诲姟锛屾湰妯″潡websocket鍙戦�佸績璺�
+@ServletComponentScan //鎵弿servlet锛屾湰妯″潡涓惎鍔╳ebsocket
 @EnableAspectJAutoProxy
 @EnableMultiDataSource
 @ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.pipIrrRemote"},
@@ -23,7 +28,8 @@
         "com.dy.pipIrrGlobal.daoSe",
         "com.dy.pipIrrGlobal.daoBa",
         "com.dy.pipIrrGlobal.daoFi",
-        "com.dy.pipIrrGlobal.daoAllRound"
+        "com.dy.pipIrrGlobal.daoAllRound",
+        "com.dy.pipIrrGlobal.daoLargeScreen"
 })
 public class PipIrrRemoteApplication {
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/config/WebSocketConfig.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/config/WebSocketConfig.java
new file mode 100644
index 0000000..7d65a4b
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/config/WebSocketConfig.java
@@ -0,0 +1,19 @@
+package com.dy.pipIrrRemote.config;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/2/10 15:42
+ * @Description
+ */
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+//寮�鍚疻ebSocket鐨勬敮鎸侊紝骞舵妸璇ョ被娉ㄥ叆鍒皊pring瀹瑰櫒涓�
+@Configuration
+public class WebSocketConfig {
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketHeartBeat.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketHeartBeat.java
new file mode 100644
index 0000000..b122c31
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketHeartBeat.java
@@ -0,0 +1,32 @@
+package com.dy.pipIrrRemote.largeScreen;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/2/11 8:37
+ * @Description
+ */
+
+import com.alibaba.fastjson2.JSON;
+import com.dy.common.util.DateTime;
+import com.dy.common.webUtil.WebSocketMessage;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WebSocketHeartBeat {
+
+    // 璁剧疆瀹氭椂鍗佺涓�娆�
+    @Scheduled(cron = "0/10 * * * * ?")
+    public void WsHeartBeat() throws Exception {
+        WebSocketServer.sendAllMessage(getHeartBeatMessage());
+    }
+
+    public static String getHeartBeatMessage() {
+        WebSocketMessage vo = new WebSocketMessage() ;
+        vo.type = WebSocketMessage.TYPE_HEARTBEAT ;
+        vo.code = "" ;//蹇冭烦鏁版嵁缂栫爜灏辨槸绌哄瓧绗︿覆
+        vo.content = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+        return JSON.toJSONString(vo) ;
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketServer.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketServer.java
new file mode 100644
index 0000000..9bcf52c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/largeScreen/WebSocketServer.java
@@ -0,0 +1,131 @@
+package com.dy.pipIrrRemote.largeScreen;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import jakarta.websocket.*;
+import jakarta.websocket.server.PathParam;
+import jakarta.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/2/10 15:25
+ * @Description 瀹㈡埛绔紙娴忚鍣級姣忓缓绔嬩竴涓獁ebsocket杩炴帴锛屾湇鍔$灏变細鍒涘缓涓�涓猈ebSocketServer瀹炰緥
+ */
+@Slf4j
+@ServerEndpoint("/websocket/ls/{id}")
+@Component
+public class WebSocketServer {
+
+    // 闈欐�佸彉閲忥紝璁板綍褰撳墠鍦ㄧ嚎杩炴帴鏁�
+    private static int onlineCount = 0;
+
+    // 瀛樻斁姣忎釜瀹㈡埛绔搴旂殑WebSocketServer瀵硅薄
+    private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
+
+    // 瀹㈡埛绔繛鎺ヤ細璇濓紝閫氳繃瀹冪粰瀹㈡埛绔彂閫佹暟鎹�
+    private Session session;
+
+    // 瀹㈡埛绔痠d
+    private String id = "";
+
+    /**
+     * 杩炴帴寤虹珛鎴愬姛璋冪敤鐨勬柟娉�
+     * @param session websocket浼氳瘽瀵硅薄
+     * @param id 瀹㈡埛绔痠d
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("id") String id) {
+        this.session = session;
+        this.id = id;
+        this.sendMessage(WebSocketHeartBeat.getHeartBeatMessage());
+
+        if (webSocketMap.containsKey(id)) {
+            webSocketMap.remove(id);
+            webSocketMap.put(id, this);
+        } else {
+            webSocketMap.put(id, this);
+            WebSocketServer.addOnlineCount();
+        }
+    }
+
+    /**
+     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     */
+    @OnClose
+    public void onClose() {
+        if (webSocketMap.containsKey(id)) {
+            webSocketMap.remove(id);
+            //浠巗et涓垹闄�
+            WebSocketServer.subOnlineCount();
+        }
+        log.info("瀹㈡埛绔�:" + id + "锛屽叧闂簡websocket");
+    }
+
+    /**
+     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
+     * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     * @param session
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) {
+        log.info("瀹㈡埛绔�:" + id + "锛寃ebsocket鎶ユ枃:" + message);
+    }
+
+    /**
+     * 浼氳瘽寮傚父
+     * @param session
+     * @param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("瀹㈡埛绔�:" + this.id + "锛寃ebsocket浼氳瘽寮傚父锛屽師鍥�:" + error.getMessage());
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佹秷鎭�
+     */
+    public void sendMessage(String message) {
+        try{
+            this.session.getBasicRemote().sendText(message);
+        }catch (Exception e){
+            log.error("瀹㈡埛绔�:" + id + "锛寃ebsocket缃戠粶鍙戦�佹暟鎹紓甯�", e);
+        }
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄧ兢鎺ㄩ�佹秷鎭�
+     */
+    public static void sendAllMessage(String message) throws IOException {
+        ConcurrentHashMap.KeySetView<String, WebSocketServer> ids = webSocketMap.keySet();
+        for (String id : ids) {
+            WebSocketServer webSocketServer = webSocketMap.get(id);
+            webSocketServer.sendMessage(message);
+        }
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄦ寚瀹氬鎴风鎺ㄩ�佹秷鎭�
+     */
+    public static void sendOneMessage(String message, String id) throws IOException {
+        if (message != null && message.length() != 0 && webSocketMap.containsKey(id)) {
+            webSocketMap.get(id).sendMessage(message);
+        } else {
+            log.error("瀹㈡埛绔�" + id + "锛屼笉鍦ㄧ嚎锛�");
+        }
+    }
+
+    public static synchronized int getOnlineCount() {
+        return onlineCount;
+    }
+
+    public static synchronized void addOnlineCount() {
+        WebSocketServer.onlineCount++;
+    }
+
+    public static synchronized void subOnlineCount() {
+        WebSocketServer.onlineCount--;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pom.xml b/pipIrr-platform/pipIrr-web/pom.xml
index 4998d97..077869b 100644
--- a/pipIrr-platform/pipIrr-web/pom.xml
+++ b/pipIrr-platform/pipIrr-web/pom.xml
@@ -76,6 +76,11 @@
             <artifactId>spring-boot-devtools</artifactId>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
         <!-- lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>
diff --git a/pipIrr-platform/pom.xml b/pipIrr-platform/pom.xml
index 97dc779..0f86264 100644
--- a/pipIrr-platform/pom.xml
+++ b/pipIrr-platform/pom.xml
@@ -27,6 +27,9 @@
     </modules>
 
     <properties>
+        <!-- 涓巎ava.version閰嶇疆鍦ㄤ竴璧凤紝璁剧疆缂栫爜闆�-->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>20</java.version>
         <tomcat.version>10.1.12</tomcat.version>
         <spring.boot.version>3.1.3</spring.boot.version>
@@ -66,7 +69,6 @@
                 <scope>import</scope>
             </dependency>
 
-            <!-- 杈撳叆鍙傛暟鎹獙璇� -->
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-validation</artifactId>
@@ -89,6 +91,13 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-websocket</artifactId>
+                <version>3.1.3</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
 
             <!-- lombok -->
             <dependency>

--
Gitblit v1.8.0