Răsfoiți Sursa

websocket 集成完成

jingyuanchao 1 an în urmă
părinte
comite
eeebe938f9

+ 11 - 0
project_data/sql/0.1.1/升级文档.txt

@@ -0,0 +1,11 @@
+
+
+1、nacos gateway配置文件修改:
+mediator的路由配置uri修改为lb:ws://soc-mediator
+完整示例(对比以往配置仅修改uri项的值):
+        - id: soc-mediator
+          uri: lb:ws://soc-mediator
+          predicates:
+            - Path=/mediator/**
+          filters:
+            - StripPrefix=1

+ 7 - 2
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/WebSocketConfig.java

@@ -1,16 +1,21 @@
 package com.xunmei.mediator.websocket;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.socket.config.annotation.EnableWebSocket;
 import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
 import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
 
 @Configuration
-@EnableWebSocket
+@EnableWebSocket()
 public class WebSocketConfig implements WebSocketConfigurer {
+    @Autowired
+    private WebSocketHandler handler;
 
+    @Autowired
+    private WebSocketInterceptor interceptor;
     @Override
     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
-        registry.addHandler(new WebSocketHandler(), "/mediator").setAllowedOrigins("*");
+        registry.addHandler(handler, "/").setAllowedOrigins("*").addInterceptors(interceptor);;
     }
 }

+ 8 - 2
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/WebSocketHandler.java

@@ -6,10 +6,12 @@ import org.springframework.web.socket.TextMessage;
 import org.springframework.web.socket.WebSocketSession;
 import org.springframework.web.socket.handler.TextWebSocketHandler;
 
+import java.io.IOException;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Component
+//@ServerEndpoint(value = "",subprotocols = {"protocol"})
 public class WebSocketHandler extends TextWebSocketHandler {
 
     private final Map<String,WebSocketSession> sessions = new ConcurrentHashMap<String,WebSocketSession>();
@@ -17,6 +19,7 @@ public class WebSocketHandler extends TextWebSocketHandler {
     @Override
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
         sessions.put("123",session);
+
         System.out.println("New connection established: " + session.getId());
     }
 
@@ -24,6 +27,7 @@ public class WebSocketHandler extends TextWebSocketHandler {
     protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
         String payload = message.getPayload();
         System.out.println("Received message: " + payload);
+        session.sendMessage(new TextMessage("Hello, client!"));
         // 处理消息并入数据库
     }
 
@@ -33,7 +37,9 @@ public class WebSocketHandler extends TextWebSocketHandler {
         System.out.println("Connection closed: " + session.getId());
     }
 
-    public void sendMessageToAll(String message) {
-
+    public void sendMessageToAll(String message) throws IOException {
+        for (WebSocketSession value : sessions.values()) {
+            value.sendMessage(new TextMessage(message));
+        }
     }
 }

+ 36 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/WebSocketInterceptor.java

@@ -0,0 +1,36 @@
+package com.xunmei.mediator.websocket;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+ 
+@Component
+public class WebSocketInterceptor implements HandshakeInterceptor {
+ 
+    private static final Logger log = LoggerFactory.getLogger(WebSocketInterceptor.class);
+ 
+    //在握手之前执行该方法, 继续握手返回true, 中断握手返回false. 通过attributes参数设置WebSocketSession的属性
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes){
+        if (request instanceof ServletServerHttpRequest) {
+            String uri = request.getURI().getPath();
+            String token = uri.substring(uri.lastIndexOf("/")+1);
+            attributes.put("token",token);
+            log.info("current token is:"+token);
+        }
+        return true;
+    }
+ 
+    @Override
+    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
+        log.info("coming webSocketInterceptor afterHandshake method...");
+    }
+ 
+}

+ 3 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/WebSocketService.java

@@ -3,6 +3,8 @@ package com.xunmei.mediator.websocket;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+
 @Service
 public class WebSocketService {
 
@@ -13,7 +15,7 @@ public class WebSocketService {
         this.webSocketHandler = webSocketHandler;
     }
 
-    public void sendMessageToAll(String message) {
+    public void sendMessageToAll(String message) throws IOException {
         webSocketHandler.sendMessageToAll(message);
     }
 }