Browse Source

feat:websocket stomp协议支持

Joburgess 3 years ago
parent
commit
609eb32009

+ 6 - 0
mec-gateway/mec-gateway-web/pom.xml

@@ -60,6 +60,12 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>com.github.mthizo247</groupId>
+			<artifactId>spring-cloud-netflix-zuul-websocket</artifactId>
+			<version>1.0.0-RELEASE</version>
+		</dependency>
     </dependencies>
 
 	<build>

+ 32 - 6
mec-teacher/src/main/java/com/ym/mec/teacher/config/WebSocketConfig.java

@@ -1,21 +1,47 @@
 package com.ym.mec.teacher.config;
 
+import com.ym.mec.teacher.handler.SoundHandler;
+import com.ym.mec.teacher.interceptor.WebSocketHandshakeInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.web.socket.config.annotation.*;
 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
 
 /**
  * @Author Joburgess
  * @Date 2021/6/8 0008
  */
 @Configuration
-@EnableWebSocket
-public class WebSocketConfig {
+@EnableWebSocketMessageBroker
+public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
 
-    @Bean
-    public ServerEndpointExporter serverEndpoint() {
-        return new ServerEndpointExporter();
+    @Autowired
+    private SoundHandler soundHandler;
+    @Autowired
+    private WebSocketHandshakeInterceptor webSocketHandshakeInterceptor;
+
+    @Override
+    public void registerStompEndpoints(StompEndpointRegistry registry) {
+        registry.addEndpoint("/soundWebSocket")
+                .setAllowedOrigins("*").withSockJS();
+    }
+
+    @Override
+    public void configureMessageBroker(MessageBrokerRegistry config) {
+        // prefix for subscribe
+        config.enableSimpleBroker("/topic");
+        // prefix for send
+        config.setApplicationDestinationPrefixes("/push");
     }
 
+    @Bean
+    public ServletServerContainerFactoryBean createWebSocketContainer() {
+        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
+        container.setMaxTextMessageBufferSize(8192*4);
+        container.setMaxBinaryMessageBufferSize(8192*4);
+        return container;
+    }
 }

+ 11 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java

@@ -11,6 +11,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.handler.annotation.MessageMapping;
+import org.springframework.messaging.handler.annotation.SendTo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -25,6 +27,8 @@ import java.util.List;
 @RestController
 public class SoundController extends BaseController {
 
+    private final Logger LOGGER = LoggerFactory.getLogger(SoundController.class);
+
     @Autowired
     private SoundService soundService;
 
@@ -44,4 +48,11 @@ public class SoundController extends BaseController {
         return soundService.measureCompare(musicXmlInfoList, record);
     }
 
+    @MessageMapping("/hello")
+    @SendTo("/topic/greetings")
+    public String greeting(String message) throws Exception {
+        LOGGER.info("接收消息:{}", message);
+        return message;
+    }
+
 }

+ 90 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/handler/SoundHandler.java

@@ -0,0 +1,90 @@
+package com.ym.mec.teacher.handler;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.web.socket.*;
+import org.springframework.web.socket.handler.AbstractWebSocketHandler;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/9 0009
+ */
+@Service
+public class SoundHandler extends AbstractWebSocketHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SoundHandler.class);
+
+    private final Map<String, WebSocketSession> clients = new ConcurrentHashMap<>();
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    public SoundHandler() {
+        super();
+    }
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            LOGGER.error("用户登录信息异常");
+        }
+        LOGGER.info("有新的客户端上线: {}", sysUser.getRealName());
+        super.afterConnectionEstablished(session);
+    }
+
+    @Override
+    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            LOGGER.error("用户登录信息异常");
+        }
+        LOGGER.info("{}: {}", sysUser.getRealName(), message);
+        super.handleMessage(session, message);
+    }
+
+    @Override
+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+        super.handleTextMessage(session, message);
+        session.sendMessage(message);
+    }
+
+    @Override
+    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
+        super.handleBinaryMessage(session, message);
+    }
+
+    @Override
+    protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
+        super.handlePongMessage(session, message);
+    }
+
+    @Override
+    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+        super.handleTransportError(session, exception);
+        LOGGER.info("发生了错误,移除客户端: {}", session.getId());
+        session.close();
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+        super.afterConnectionClosed(session, status);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            LOGGER.error("用户登录信息异常");
+        }
+        LOGGER.info("{}离线", sysUser.getRealName());
+    }
+
+    @Override
+    public boolean supportsPartialMessages() {
+        return super.supportsPartialMessages();
+    }
+}

+ 26 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/interceptor/WebSocketHandshakeInterceptor.java

@@ -0,0 +1,26 @@
+package com.ym.mec.teacher.interceptor;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/9 0009
+ */
+@Component
+public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
+        return true;
+    }
+
+    @Override
+    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
+
+    }
+}

+ 0 - 50
mec-teacher/src/main/java/com/ym/mec/teacher/websocket/SoundWebSocket.java

@@ -1,50 +0,0 @@
-package com.ym.mec.teacher.websocket;
-
-import org.springframework.stereotype.Component;
-
-import javax.websocket.OnClose;
-import javax.websocket.OnMessage;
-import javax.websocket.OnOpen;
-import javax.websocket.Session;
-import javax.websocket.server.ServerEndpoint;
-import java.io.IOException;
-
-/**
- * @Author Joburgess
- * @Date 2021/6/8 0008
- */
-@ServerEndpoint("/soundPoint")
-@Component
-public class SoundWebSocket {
-
-    /**
-     * 连接成功
-     *
-     * @param session
-     */
-    @OnOpen
-    public void onOpen(Session session) {
-        System.out.println("连接成功");
-    }
-
-    /**
-     * 连接关闭
-     *
-     * @param session
-     */
-    @OnClose
-    public void onClose(Session session) {
-        System.out.println("连接关闭");
-    }
-
-    /**
-     * 接收到消息
-     *
-     * @param text
-     */
-    @OnMessage
-    public String onMsg(String text) throws IOException {
-        return "servet 发送:" + text;
-    }
-
-}