From 33434cc72b423afa36f6bfaa6ff07919336d8978 Mon Sep 17 00:00:00 2001
From: zhoushihao <zsh19950802@163.com>
Date: 星期五, 22 八月 2025 15:18:45 +0800
Subject: [PATCH] 1、websocket更新

---
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java |  203 +++++++++++++++++++++-----------------------------
 1 files changed, 84 insertions(+), 119 deletions(-)

diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java
index 480921c..8602e38 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java
@@ -10,166 +10,131 @@
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.Semaphore;
 
 @ServerEndpoint(value = "/api/talk/{username}")
-@Component("webSocketServer")
+@Component
 public class WebSocketServer {
 
-
-    public static ConfigurableApplicationContext applicationContext;
-
     private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
-    private List<String> messages;
-    /**
-     * 璁板綍褰撳墠鍦ㄧ嚎杩炴帴鏁�
-     */
-    public static final Map<String, ArrayList<WebSocketServer>> sessionMap = new ConcurrentHashMap<>();
+    private static final int MAX_MESSAGE_SIZE = 50000; // 鍗曟娑堟伅鍒嗗潡闃堝��
+    private static final Semaphore semaphore = new Semaphore(100); // 娴侀噺鎺у埗
 
-    public String username;
-    public Session session;
+    // 鎸夌敤鎴峰悕鍒嗙粍瀛樺偍Session锛堢嚎绋嬪畨鍏級
+    private static final Map<String, List<WebSocketServer>> sessionMap = new ConcurrentHashMap<>();
 
-    public WebSocketServer() {
-        this.messages = new ArrayList<>();
-    }
+    // 褰撳墠杩炴帴鐨勭敤鎴峰悕鍜孲ession
+    private String webSocketName;
+    private Session session;
+    private final List<String> messages = new CopyOnWriteArrayList<>(); // 绾跨▼瀹夊叏娑堟伅璁板綍
 
     /**
-     * 杩炴帴寤虹珛鎴愬姛璋冪敤鐨勬柟娉�
+     * 杩炴帴寤虹珛
      */
     @OnOpen
-    public void onOpen(Session session, @PathParam("username") String username) {
-        this.username = username;
+    public void onOpen(Session session, @PathParam("webSocketName") String webSocketName) {
+        this.webSocketName = webSocketName;
         this.session = session;
-        List<WebSocketServer> webSocketServers = sessionMap.get(username);
-        if (webSocketServers == null) {
-            ArrayList<WebSocketServer> arrayListwebserver = new ArrayList<WebSocketServer>();
-            arrayListwebserver.add(this);
-            sessionMap.put(username, arrayListwebserver);
-        } else {
-            webSocketServers.add(this);
-        }
 
-        log.info("鏈夋柊鐢ㄦ埛鍔犲叆锛寀sername={}, 褰撳墠鍦ㄧ嚎浜烘暟涓猴細{}", username, sessionMap.get(username).size());
+        sessionMap.computeIfAbsent(webSocketName, k -> new CopyOnWriteArrayList<>())
+                .add(this);
 
-        // JSONObject result = new JSONObject();
-        // JSONArray array = new JSONArray();
-        // result.set("users", array);
-        // for (Object key : sessionMap.keySet()) {
-        // JSONObject jsonObject = new JSONObject();
-        // jsonObject.set("username", key);
-        // array.add(jsonObject);
-        // }
-
-        // sendAllMessage(JSONUtil.toJsonStr(result)); // 鍚庡彴鍙戦�佹秷鎭粰鎵�鏈夌殑瀹㈡埛绔�
+        log.info("鐢ㄦ埛杩炴帴: webSocketName={}, 褰撳墠浼氳瘽鏁�: {}", webSocketName,
+                sessionMap.getOrDefault(webSocketName, Collections.emptyList()).size());
     }
 
     /**
-     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     * 杩炴帴鍏抽棴
      */
     @OnClose
-    public void onClose(Session session, @PathParam("username") String username) {
-        List<WebSocketServer> webSocketServers = sessionMap.get(username);
-        ArrayList<WebSocketServer> arrayListwebserver = new ArrayList<WebSocketServer>();
-        if (webSocketServers.size() > 1) {
-            for (WebSocketServer webSocketServer : webSocketServers) {
-                if (webSocketServer != this) {
-                    arrayListwebserver.add(webSocketServer);
-                }
+    public void onClose() {
+        List<WebSocketServer> sessions = sessionMap.get(webSocketName);
+        if (sessions != null) {
+            sessions.remove(this);
+            if (sessions.isEmpty()) {
+                sessionMap.remove(webSocketName);
             }
-            sessionMap.put(username, arrayListwebserver);
-            log.info("绉婚櫎username={}涓�鍚嶇敤鎴穝ession, {}鐨勫綋鍓嶅湪绾夸汉鏁颁负锛歿}", username, username, sessionMap.get(username).size());
-        } else {
-            sessionMap.remove(username);
-            log.info("绉婚櫎username={}涓�鍚嶇敤鎴穝ession, {}杩炴帴鍏抽棴, 褰撳墠杩炴帴鏁颁负锛歿}", username, username, sessionMap.size());
+            log.info("鐢ㄦ埛鏂紑: webSocketName={}, 鍓╀綑浼氳瘽鏁�: {}", webSocketName,
+                    sessionMap.getOrDefault(webSocketName, Collections.emptyList()).size());
         }
-
     }
 
     /**
-     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
-     * 鍚庡彴鏀跺埌瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
-     * onMessage 鏄竴涓秷鎭殑涓浆绔�
-     * 鎺ュ彈 娴忚鍣ㄧ socket.send 鍙戦�佽繃鏉ョ殑 json鏁版嵁
-     *
-     * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     * 鎺ユ敹娑堟伅
      */
     @OnMessage
-    public void onMessage(String message, Session session, @PathParam("username") String username) {
-        log.info("鏈嶅姟绔敹鍒扮敤鎴穟sername={}鐨勬秷鎭�:{}", username, message);
+    public void onMessage(String message) {
+        log.info("鏀跺埌娑堟伅: webSocketName={}, content={}", webSocketName, message);
         JSONObject obj = JSONUtil.parseObj(message);
-        String text = obj.getStr("data");
-
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.set("message", text);
-        this.messages.add(text);
-    }
-
-    @OnError
-    public void onError(Session session, Throwable error) {
-        log.error("鍙戠敓閿欒");
-        error.printStackTrace();
+        messages.add(obj.getStr("data")); // 瀛樺偍娑堟伅鍘嗗彶
     }
 
     /**
-     * 鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔�
+     * 閿欒澶勭悊
      */
-    public void sendMessage(String message) {
-        try {
-            // log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", this.session.getId(), message);
-            if(this.session.isOpen()){
-                int maxChunkSize = 50000; // 瀹氫箟鏈�澶х殑鍒嗗潡澶у皬
-                int length = message.length();
-                if(length>50000){
-                    int chunks = (int) Math.ceil((double) length / maxChunkSize);
-                    //鍒嗗潡鍙戦�佹秷鎭�
-                    for (int i = 0; i < chunks; i++) {
-                        int startIndex = i * maxChunkSize;
-                        int endIndex = Math.min(startIndex + maxChunkSize, length);
-                        String chunk = message.substring(startIndex, endIndex);
+    @OnError
+    public void onError(Throwable error) {
+        log.error("WebSocket閿欒: webSocketName={}", webSocketName, error);
+    }
 
-                        // 鍒ゆ柇鏄惁鏄渶鍚庝竴鍧楁秷鎭�
-                        boolean isLastChunk = (i == chunks - 1);
-                        if(isLastChunk==true){
-                            chunk+="<END>";
-                        }
-                        // 鍙戦�佸垎鍧楁秷鎭紝骞朵紶閫掓槸鍚︽槸鏈�鍚庝竴鍧楁秷鎭殑鏍囪瘑
-                        this.session.getBasicRemote().sendText(chunk);
-                    }
-                }else{
-                    this.session.getBasicRemote().sendText(message);
-                }
-
+    /**
+     * 鍚戝綋鍓嶇敤鎴风殑鎵�鏈変細璇濆彂閫佹秷鎭�
+     */
+    public void sendToWeb(String webSocketName, String message) {
+        List<WebSocketServer> sessions = sessionMap.get(webSocketName);
+        if (sessions == null) return;
+        sessions.forEach(ws -> {
+            try {
+                semaphore.acquire();
+                ws.sendChunkedMessage(message);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            } catch (Exception e) {
+                log.error("鎺ㄩ�佸け璐�: webSocketName={}", webSocketName, e);
+            } finally {
+                semaphore.release();
             }
-        } catch (Exception e) {
-            log.error("鍙戦�佹秷鎭粰瀹㈡埛绔け璐ワ細{}", e.getMessage(), e);
+        });
+    }
+
+    /**
+     * 鍒嗗潡鍙戦�佸ぇ娑堟伅
+     */
+    private void sendChunkedMessage(String message) {
+        if (!session.isOpen()) return;
+        try {
+            if (message.length() <= MAX_MESSAGE_SIZE) {
+                session.getBasicRemote().sendText(message);
+                return;
+            }
+
+            // 鍒嗗潡鍙戦��
+            int chunks = (int) Math.ceil((double) message.length() / MAX_MESSAGE_SIZE);
+            for (int i = 0; i < chunks; i++) {
+                int start = i * MAX_MESSAGE_SIZE;
+                int end = Math.min(start + MAX_MESSAGE_SIZE, message.length());
+                String chunk = message.substring(start, end) + (i == chunks - 1 ? "<END>" : "");
+                session.getBasicRemote().sendText(chunk);
+            }
+        } catch (IOException e) {
+            log.error("娑堟伅鍙戦�佸け璐�: webSocketName={}", webSocketName, e);
         }
     }
 
-    // /**
-    //  * 鏈嶅姟绔彂閫佹秷鎭粰鎵�鏈夊鎴风
-    //  */
-    // public void sendAllMessage(String message) {
-    //     try {
-    //         for (WebSocketServer webSocketServer : sessionMap.values()) {
-    //             // log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", this.session.getId(), message);
-    //             webSocketServer.sendMessage(message);
-    //         }
-    //     } catch (Exception e) {
-    //         log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", e);
-    //     }
-    // }
+    // --- 宸ュ叿鏂规硶 ---
+    public static Set<String> getOnlineUsers() {
+        return sessionMap.keySet();
+    }
 
     public List<String> getMessages() {
-        return messages;
-
+        return Collections.unmodifiableList(messages);
     }
 
     public void clearMessages() {
         messages.clear();
     }
-
-
-}
+}
\ No newline at end of file

--
Gitblit v1.8.0