From 7ae7bcc0245afa4d94516feddc2b8bd60e4253c6 Mon Sep 17 00:00:00 2001 From: wuyouming666 <2265557248@qq.com> Date: 星期一, 11 十二月 2023 10:25:02 +0800 Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10101/r/CanadaMes --- springboot-vue3/src/main/java/com/example/springboot/component/WebSocketServer.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 167 insertions(+), 0 deletions(-) diff --git a/springboot-vue3/src/main/java/com/example/springboot/component/WebSocketServer.java b/springboot-vue3/src/main/java/com/example/springboot/component/WebSocketServer.java new file mode 100644 index 0000000..dfea454 --- /dev/null +++ b/springboot-vue3/src/main/java/com/example/springboot/component/WebSocketServer.java @@ -0,0 +1,167 @@ +package com.example.springboot.component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; + +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.stereotype.Component; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; + +@ServerEndpoint(value = "/api/talk/{username}") +@Component +public class WebSocketServer { + + // @Autowired + // HomeMapper homeMapper; + + static ConfigurableApplicationContext applicationContext; + + // 瑙e喅鏃犳硶娉ㄥ叆mapper闂 //浣跨敤鏂规硶 + // homeMapper=WebSocketServer.applicationContext.getBean(HomeMapper.class); + public static void setApplicationContext(ConfigurableApplicationContext configurableApplicationContext) { + WebSocketServer.applicationContext = configurableApplicationContext; + } + + private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class); + private List<String> messages; + /** + * 璁板綍褰撳墠鍦ㄧ嚎杩炴帴鏁� + */ + public static final Map<String, ArrayList<WebSocketServer>> sessionMap = new ConcurrentHashMap<>(); + + String username; + Session session; + + public WebSocketServer() { + this.messages = new ArrayList<>(); + } + + /** + * 杩炴帴寤虹珛鎴愬姛璋冪敤鐨勬柟娉� + */ + @OnOpen + public void onOpen(Session session, @PathParam("username") String username) { + this.username = username; + 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()); + + // 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)); // 鍚庡彴鍙戦�佹秷鎭粰鎵�鏈夌殑瀹㈡埛绔� + } + + /** + * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉� + */ + @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); + } + } + 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()); + } + + } + + /** + * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉� + * 鍚庡彴鏀跺埌瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅 + * onMessage 鏄竴涓秷鎭殑涓浆绔� + * 鎺ュ彈 娴忚鍣ㄧ socket.send 鍙戦�佽繃鏉ョ殑 json鏁版嵁 + * + * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅 + */ + @OnMessage + public void onMessage(String message, Session session, @PathParam("username") String username) { + log.info("鏈嶅姟绔敹鍒扮敤鎴穟sername={}鐨勬秷鎭�:{}", username, message); + JSONObject obj = JSONUtil.parseObj(message); + String text = obj.getStr("data"); + + JSONObject jsonObject = new JSONObject(); + jsonObject.set("message", text); + this.messages.add(text); + this.sendMessage(jsonObject.toString()); // JSONUtil.toJsonStr(jsonObject) + + } + + @OnError + public void onError(Session session, Throwable error) { + log.error("鍙戠敓閿欒"); + error.printStackTrace(); + } + + /** + * 鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔� + */ + public void sendMessage(String message) { + try { + // log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", this.session.getId(), message); + this.session.getBasicRemote().sendText(message); + } catch (Exception e) { + log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", 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 List<String> getMessages() { + return messages; + + } + + public void clearMessages() { + messages.clear(); + } +} -- Gitblit v1.8.0