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