From e875b0447807a540b8b8be823840beb93f8474b8 Mon Sep 17 00:00:00 2001 From: "453530270@qq.com" Date: Sun, 15 Sep 2024 18:01:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0websocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcms/jchat/config/WebSocketConfig.java | 15 +++++ .../app/bcms/jchat/websocket/ChatSocket.java | 7 ++ .../jchat/websocket/WebSocketManager.java | 65 +++++++++++++++++++ .../bcms/jchat/websocket/WebSocketServer.java | 43 ++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 src/main/java/app/bcms/jchat/config/WebSocketConfig.java create mode 100644 src/main/java/app/bcms/jchat/websocket/ChatSocket.java create mode 100644 src/main/java/app/bcms/jchat/websocket/WebSocketManager.java create mode 100644 src/main/java/app/bcms/jchat/websocket/WebSocketServer.java diff --git a/src/main/java/app/bcms/jchat/config/WebSocketConfig.java b/src/main/java/app/bcms/jchat/config/WebSocketConfig.java new file mode 100644 index 0000000..d52e80a --- /dev/null +++ b/src/main/java/app/bcms/jchat/config/WebSocketConfig.java @@ -0,0 +1,15 @@ +package app.bcms.jchat.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +//开启WebSocket的支持,并把该类注入到spring容器中 +@Configuration +public class WebSocketConfig { + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} + diff --git a/src/main/java/app/bcms/jchat/websocket/ChatSocket.java b/src/main/java/app/bcms/jchat/websocket/ChatSocket.java new file mode 100644 index 0000000..e241dd4 --- /dev/null +++ b/src/main/java/app/bcms/jchat/websocket/ChatSocket.java @@ -0,0 +1,7 @@ +package app.bcms.jchat.websocket; + +/** + * 聊天soket + */ +public class ChatSocket { +} diff --git a/src/main/java/app/bcms/jchat/websocket/WebSocketManager.java b/src/main/java/app/bcms/jchat/websocket/WebSocketManager.java new file mode 100644 index 0000000..e53000c --- /dev/null +++ b/src/main/java/app/bcms/jchat/websocket/WebSocketManager.java @@ -0,0 +1,65 @@ +package app.bcms.jchat.websocket; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.websocket.Session; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * WebSocketServer管理类 + */ +public class WebSocketManager { + private final static Log log = LogFactory.getLog(WebSocketManager.class); + + private final static CopyOnWriteArraySet webSocketServerSet = new CopyOnWriteArraySet<>(); + + private final static ConcurrentHashMap webSocketServerMap = new ConcurrentHashMap<>(); + + public static void addWebSocketServer(WebSocketServer webSocketServer){ + if (webSocketServer != null){ + webSocketServerSet.add(webSocketServer); + webSocketServerMap.put(webSocketServer.getSessionId(), webSocketServer); + } + } + + public static void removeWebSocketServer(WebSocketServer webSocketServer){ + webSocketServerSet.remove(webSocketServer); + webSocketServerMap.remove(webSocketServer.getSessionId()); + } + + /** + * 通过SessionId发送消息给特定用户 + * @param + * @param msg + */ + public static void sentToUser(String sessionId, String msg){ + Session session = webSocketServerMap.get(sessionId).getSession(); + sentToUser(session, msg); + } + + /** + * 通过Session发送消息给特定用户 + * @param session + * @param msg + */ + public static void sentToUser(Session session, String msg){ + if (session == null){ + log.error("不存在该Session,无法发送消息"); + return; + } + session.getAsyncRemote().sendText(msg); + } + + /** + * 发送消息给所有用户 + * @param msg + */ + public static void sentToAllUser(String msg){ + for (WebSocketServer webSocketServer : webSocketServerSet) { + sentToUser(webSocketServer.getSession(), msg); + } + log.info("向所有用户发送WebSocket消息完毕,消息:"+ msg); + } +} diff --git a/src/main/java/app/bcms/jchat/websocket/WebSocketServer.java b/src/main/java/app/bcms/jchat/websocket/WebSocketServer.java new file mode 100644 index 0000000..8d953c7 --- /dev/null +++ b/src/main/java/app/bcms/jchat/websocket/WebSocketServer.java @@ -0,0 +1,43 @@ +package app.bcms.jchat.websocket; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.websocket.*; + +public class WebSocketServer { + private final static Log log = LogFactory.getLog(WebSocketServer.class); + private Session session; + + @OnOpen + public void onOpen(Session session) { + this.session = session; + WebSocketManager.sentToUser(session, "WebSocket is connected!"); + WebSocketManager.addWebSocketServer(this); + log.info("与SessionId:"+session.getId()+"建立连接"); + } + + @OnClose + public void onClose() { + WebSocketManager.removeWebSocketServer(this); + log.info("WebSocket连接关闭"); + } + + @OnMessage + public void onMessage(String message, Session session) { + log.info("来自SessionId:"+session.getId()+"的消息:{}"+message); + } + + @OnError + public void onError(Session session, Throwable error) { + log.error("Session:"+session.getId()+"的WebSocket发生错误"+error); + } + + public Session getSession() { + return session; + } + + public String getSessionId() { + return session.getId(); + } +}