liusuyi
2024-08-12 91b70d5ad2ada85cf00b25f7b9ecd9cf980bf138
ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -1,8 +1,12 @@
package com.ruoyi.utils.websocket.service;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONException;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.app.position.service.impl.AppPositionPushService;
import com.ruoyi.call.dto.CallMessage;
import com.ruoyi.call.listener.WebsocketHandler;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
@@ -44,49 +48,19 @@
    @OnMessage
    public void onMessage(@PathParam("userId") String userId, String message) {
        log.debug("收到消息:" + message);
        Map<String, Object> messageMap = JSONObject.parseObject(message, Map.class);
        if (messageMap.get("type")!=null &&messageMap.get("type").equals("callMessage")) {
            String msg = (String) messageMap.get("message");
            CallMessage callMessage = JSONObject.parseObject(msg, CallMessage.class);
            //单聊
            if (callMessage != null && callMessage.getType().equals(0)) {
                WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message);
            }
            //群聊
            if (callMessage != null && callMessage.getType().equals(1)) {
                String step = callMessage.getStep();
                switch (step) {
                    case "joinRoom":
                        Set<String> userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>());
                        userSet.add(callMessage.getUserId());
                        WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet);
                        WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message);
                        break;
                    case "inviteRoom":
                        List<String> targetIds = callMessage.getTargetIds();
                        targetIds.stream().forEach(targetId -> {
                            WebSocketUtils.sendMessagePrefix(targetId, message);
                        });
                        break;
                    case "leaveRoom":
                        userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>());
                        if (userSet.size() > 0) {
                            userSet.remove(callMessage.getUserId());
                            WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet);
                            WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message);
                        }
                        break;
                    default:
                        WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message);
                        break;
                }
            }
        }
        try {
            if(isValidJson(message)) {
                // 处理视频通话消息
                WebsocketHandler.handleMessage(userId, message);
        // 根据用户新的频率重新调整定时任务
        AppPositionPushService.messageHandler(userId, message);
            } else {
                // 处理其他消息
                WebSocketUtils.sendMessage(userId,"Received an invalid JSON message:"+message);
            }
        } catch (Exception ex) {
            WebSocketUtils.sendMessage(userId, "无法解析消息【" + message + "】:" + ex.getMessage());
        }
    }
    @OnClose
@@ -114,4 +88,20 @@
        }
        log.info("Throwable msg " + throwable.getMessage());
    }
    /**
     * 检查给定的字符串是否为有效的JSON格式。
     *
     * @param message 要检查的字符串
     * @return 如果是有效的JSON字符串,返回true;否则返回false。
     */
    public static boolean isValidJson(String message) {
        try {
            Object json = JSON.parse(message);
            // 确保解析结果是JSONObject或JSONArray类型
            return (json instanceof JSONObject || json instanceof JSONArray);
        } catch (JSONException e) {
            return false;  // 解析失败,说明不是合法的JSON
        }
    }
}