Browse Source

socket和xfyun

lighter 8 months ago
parent
commit
faee1f3cce

+ 1 - 1
thyy-socket/src/main/java/org/thyy/socket/controller/PublicController.java

@@ -40,7 +40,7 @@ public class PublicController {
         if (business1 == null) {
             return R.ok();
         }
-        business1.sendRoom(json);
+        business1.sendMessage(json);
         return R.ok();
     }
 

+ 1 - 1
thyy-socket/src/main/java/org/thyy/socket/service/Archive.java

@@ -58,7 +58,7 @@ public class Archive implements Business {
     }
 
     @Override
-    public void sendRoom(JSONObject data) {
+    public void sendMessage(JSONObject data) {
         List<ArchiveSession> list = room.get(data.getString("roomCode"));
         if (list == null) {
             return;

+ 1 - 1
thyy-socket/src/main/java/org/thyy/socket/service/Business.java

@@ -43,7 +43,7 @@ public interface Business {
         }
     }
 
-    default void sendRoom(JSONObject json) {
+    default void sendMessage(JSONObject json) {
     }
 
 }

+ 1 - 1
thyy-socket/src/main/java/org/thyy/socket/service/Intergration.java

@@ -68,7 +68,7 @@ public class Intergration implements Business {
     }
 
     @Override
-    public void sendRoom(JSONObject json) {
+    public void sendMessage(JSONObject json) {
         function.runController(json);
     }
 }

+ 104 - 0
thyy-socket/src/main/java/org/thyy/socket/service/IntergrationPlatform.java

@@ -0,0 +1,104 @@
+package org.thyy.socket.service;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Component
+public class IntergrationPlatform implements Business {
+    private final Map<String, List<WebSocketSession>> sessionContainer = new ConcurrentHashMap<>();
+    public static final String SINGLE_LOGIN = """
+            {"name": "sidSingle", "code":"sidSingle"}""";
+
+    @Override
+    public void onOpen(WebSocketSession session, String sid) {
+        List<WebSocketSession> sessionList = sessionContainer.get(sid);
+        if (null == sessionList) {
+            sessionList = new ArrayList<>();
+            sessionList.add(session);
+            sessionContainer.put(sid, sessionList);
+        } else {
+            String currentIp = (String) session.getAttributes().get("ip");
+            for (WebSocketSession item : sessionList) {
+                if (!item.getAttributes().get("ip").equals(currentIp)) {
+                    Business.send(item, SINGLE_LOGIN);
+                }
+            }
+            sessionList.add(session);
+        }
+        log.info("有新连接加入:{},当前在线人数为:{}", sid, sessionContainer.size());
+    }
+
+    @Override
+    public void onClose(WebSocketSession session, String sid) {
+        List<WebSocketSession> sessionList = sessionContainer.get(sid);
+        sessionList.remove(session);
+        if (sessionList.isEmpty()) {
+            sessionContainer.remove(sid);
+        }
+        log.info("有一连接关闭:{},当前在线人数为:{}", sid, sessionContainer.size());
+    }
+
+    @Override
+    public void onMessage(WebSocketSession session, String sid, String data) {
+        if (data.equals("heart-beat")) {
+            Business.send(session, data);
+        }
+    }
+
+    @Override
+    public void sendMessage(JSONObject json) {
+        String mode = json.getString("mode");
+        switch (mode) {
+            case "SINGLE":
+                sendMessageBySid(json);
+                break;
+            case "MULTI":
+                sendMessageBySidList(json);
+                break;
+            case "ALL":
+                sendMessageToAll(json);
+                break;
+        }
+    }
+
+    private void sendMessageBySid(JSONObject json) {
+        String sid = json.getString("sid");
+        String msg = json.getString("msg");
+        executeSendMessage(sid, msg);
+    }
+
+    private void sendMessageBySidList(JSONObject json) {
+        String msg = json.getString("msg");
+        JSONArray sidList = json.getJSONArray("sidList");
+        for (int i = 0; i < sidList.size(); i++) {
+            String sid = sidList.getString(i);
+            executeSendMessage(sid, msg);
+        }
+    }
+
+    private void sendMessageToAll(JSONObject json) {
+        String msg = json.getString("msg");
+        for (String sid : sessionContainer.keySet()) {
+            executeSendMessage(sid, msg);
+        }
+    }
+
+    private void executeSendMessage(String sid, String msg) {
+        List<WebSocketSession> sessionList = sessionContainer.get(sid);
+        try {
+            for (WebSocketSession item : sessionList) {
+                item.sendMessage(new TextMessage(msg));
+            }
+        } catch (Exception ignored) {}
+    }
+}

+ 1 - 1
thyy-socket/src/main/java/org/thyy/socket/service/NursingRecordBoard.java

@@ -39,7 +39,7 @@ public class NursingRecordBoard implements Business {
     }
 
     @Override
-    public void sendRoom(JSONObject json) {
+    public void sendMessage(JSONObject json) {
         String ward = json.getString("ward");
         String isCall = json.getString("state");
         List<WebSocketSession> webSocketSessions = rooms.get(ward);

+ 37 - 0
thyy-socket/src/main/java/org/thyy/socket/service/callnumber/HelpDeskScreen.java

@@ -0,0 +1,37 @@
+package org.thyy.socket.service.callnumber;
+
+import com.alibaba.fastjson2.JSONObject;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketSession;
+import org.thyy.socket.service.Business;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class HelpDeskScreen implements Business {
+    private ConcurrentHashMap<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
+
+    @Override
+    public void onOpen(WebSocketSession session, String sid) {
+        ScreenSession.instance().newConnection(sessionMap, sid, session);
+    }
+
+    @Override
+    public void onClose(WebSocketSession session, String sid) {
+        sessionMap.remove(sid, session);
+    }
+
+    @Override
+    public void onMessage(WebSocketSession session, String sid, String data) {
+        if (data.equals("heart-beat")) {
+            Business.send(session, data);
+        }
+    }
+
+    @Override
+    public void sendMessage(JSONObject json) {
+        String sid = json.getString("sid");
+        WebSocketSession session = sessionMap.get(sid);
+        ScreenSession.instance().sendMessage(json, session);
+    }
+}

+ 37 - 0
thyy-socket/src/main/java/org/thyy/socket/service/callnumber/RoomScreen.java

@@ -0,0 +1,37 @@
+package org.thyy.socket.service.callnumber;
+
+import com.alibaba.fastjson2.JSONObject;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketSession;
+import org.thyy.socket.service.Business;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class RoomScreen implements Business {
+    private final ConcurrentHashMap<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
+
+    @Override
+    public void onOpen(WebSocketSession session, String sid) {
+        ScreenSession.instance().newConnection(sessionMap, sid, session);
+    }
+
+    @Override
+    public void onClose(WebSocketSession session, String sid) {
+        sessionMap.remove(sid, session);
+    }
+
+    @Override
+    public void onMessage(WebSocketSession session, String sid, String data) {
+        if (data.equals("heart-beat")) {
+            Business.send(session, data);
+        }
+    }
+
+    @Override
+    public void sendMessage(JSONObject json) {
+        String sid = json.getString("sid");
+        WebSocketSession session = sessionMap.get(sid);
+        ScreenSession.instance().sendMessage(json, session);
+    }
+}

+ 46 - 0
thyy-socket/src/main/java/org/thyy/socket/service/callnumber/ScreenSession.java

@@ -0,0 +1,46 @@
+package org.thyy.socket.service.callnumber;
+
+import com.alibaba.fastjson2.JSONObject;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.thyy.socket.service.Business;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import static org.thyy.socket.service.IntergrationPlatform.SINGLE_LOGIN;
+
+public class ScreenSession {
+    private static ScreenSession INSTANCE;
+
+    private ScreenSession() {}
+
+    public static ScreenSession instance() {
+        synchronized (ScreenSession.class) {
+            if (null == INSTANCE) {
+                INSTANCE = new ScreenSession();
+            }
+        }
+        return INSTANCE;
+    }
+
+    public void newConnection(ConcurrentHashMap<String, WebSocketSession> sessionMap,
+                              String sid, WebSocketSession session) {
+        if (sessionMap.containsKey(sid)) {
+            String currentIp = (String) session.getAttributes().get("ip");
+            WebSocketSession oldSession = sessionMap.get(sid);
+            if (!oldSession.getAttributes().get("ip").equals(currentIp)) {
+                Business.send(oldSession, SINGLE_LOGIN);
+                sessionMap.remove(sid, oldSession);
+            }
+        }
+        sessionMap.put(sid, session);
+    }
+
+    public void sendMessage(JSONObject json, WebSocketSession session) {
+        if (session != null) {
+            try {
+                session.sendMessage(new TextMessage(json.getString("msg")));
+            } catch (Exception ignored) {}
+        }
+    }
+}

+ 1 - 1
thyy-thirdpart-api/src/main/java/org/thyy/thirdpartapi/xfyun/XfTtsApi.java

@@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @RestController
-@RequestMapping("/xfTtsApi")
+@RequestMapping("/xfTts")
 public class XfTtsApi {
     private TtsClient ttsClient;
     private final XfConfig cfg;

+ 2 - 0
thyy-thirdpart-api/src/main/resources/application.yml

@@ -3,6 +3,8 @@ spring:
     name: thyy-thirdpart-api
 server:
   port: 21701
+  servlet:
+    context-path: /thyy/thirdpart/api
 
 thyy:
   xfyun: