|
|
@@ -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) {}
|
|
|
+ }
|
|
|
+}
|