From b67b6a281be18d6fd5054228fcd3571624b206c3 Mon Sep 17 00:00:00 2001 From: yubinCloud Date: Thu, 29 Apr 2021 11:45:13 +0800 Subject: [PATCH] =?UTF-8?q?10-8=20=E9=9B=86=E6=88=90=20WebSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 ++ .../fairywiki/config/WebSocketConfig.java | 15 ++++ .../fairywiki/websocket/WebSocketServer.java | 75 +++++++++++++++++++ web/src/components/the-footer.vue | 43 ++++++++++- 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/github/yubincloud/fairywiki/config/WebSocketConfig.java create mode 100644 src/main/java/io/github/yubincloud/fairywiki/websocket/WebSocketServer.java diff --git a/pom.xml b/pom.xml index 4aa22ae..b99f154 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,11 @@ 3.0.2 + + org.springframework.boot + spring-boot-starter-websocket + + diff --git a/src/main/java/io/github/yubincloud/fairywiki/config/WebSocketConfig.java b/src/main/java/io/github/yubincloud/fairywiki/config/WebSocketConfig.java new file mode 100644 index 0000000..a44dd5b --- /dev/null +++ b/src/main/java/io/github/yubincloud/fairywiki/config/WebSocketConfig.java @@ -0,0 +1,15 @@ +package io.github.yubincloud.fairywiki.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} diff --git a/src/main/java/io/github/yubincloud/fairywiki/websocket/WebSocketServer.java b/src/main/java/io/github/yubincloud/fairywiki/websocket/WebSocketServer.java new file mode 100644 index 0000000..4e31859 --- /dev/null +++ b/src/main/java/io/github/yubincloud/fairywiki/websocket/WebSocketServer.java @@ -0,0 +1,75 @@ +package io.github.yubincloud.fairywiki.websocket; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; + +@Component +@ServerEndpoint("/ws/{token}") +public class WebSocketServer { + private static final Logger LOG = LoggerFactory.getLogger(WebSocketServer.class); + + /** + * 每个客户端一个token + */ + private String clientToken = ""; + + private static final HashMap sessionMap = new HashMap<>(); + + /** + * 连接成功 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) { + sessionMap.put(token, session); + this.clientToken = token; + LOG.info("有新连接:token:{},session id:{},当前连接数:{}", token, session.getId(), sessionMap.size()); + } + + /** + * 连接关闭 + */ + @OnClose + public void onClose(Session session) { + sessionMap.remove(this.clientToken); + LOG.info("连接关闭,token:{},session id:{}!当前连接数:{}", this.clientToken, session.getId(), sessionMap.size()); + } + + /** + * 收到消息 + */ + @OnMessage + public void onMessage(String message, Session session) { + LOG.info("收到消息:{},内容:{}", clientToken, message); + } + + /** + * 连接错误 + */ + @OnError + public void onError(Session session, Throwable error) { + LOG.error("发生错误", error); + } + + /** + * 群发消息 + */ + public void sendInfo(String message) { + for (String token : sessionMap.keySet()) { + Session session = sessionMap.get(token); + try { + session.getBasicRemote().sendText(message); + } catch (IOException e) { + LOG.error("推送消息失败:{},内容:{}", token, message); + } + LOG.info("推送消息:{},内容:{}", token, message); + } + } + +} diff --git a/web/src/components/the-footer.vue b/web/src/components/the-footer.vue index 1572412..41bd5f1 100644 --- a/web/src/components/the-footer.vue +++ b/web/src/components/the-footer.vue @@ -6,14 +6,55 @@