From 91b70d5ad2ada85cf00b25f7b9ecd9cf980bf138 Mon Sep 17 00:00:00 2001 From: liusuyi <1951119284@qq.com> Date: 星期一, 12 八月 2024 16:42:44 +0800 Subject: [PATCH] 优化:websocket接收消息 --- ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java | 12 +++ ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java | 72 ++++++++++------------- ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java | 24 +++---- ard-work/src/main/java/com/ruoyi/call/listener/WebsocketHandler.java | 68 ++++++++++++++++++++++ 4 files changed, 121 insertions(+), 55 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java index d60f957..a993ad1 100644 --- a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java +++ b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java @@ -88,12 +88,12 @@ IArdAppPositionService ardAppPositionService = SpringUtils.getBean(IArdAppPositionService.class); ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId()); if (StringUtils.isNotNull(ardAppPosition)) { - Map<String, Object> params=new HashMap<>(); - params.put("longitude",ardAppPosition.getLongitude()); - params.put("latitude",ardAppPosition.getLatitude()); - params.put("speed",ardAppPosition.getSpeed()); - params.put("bearing",ardAppPosition.getBearing()); - params.put("name",sysUser.getUserName()); + Map<String, Object> params = new HashMap<>(); + params.put("longitude", ardAppPosition.getLongitude()); + params.put("latitude", ardAppPosition.getLatitude()); + params.put("speed", ardAppPosition.getSpeed()); + params.put("bearing", ardAppPosition.getBearing()); + params.put("name", sysUser.getUserName()); ardAppPosition.setParams(params); ArdAppPositions.add(ardAppPosition); } @@ -108,8 +108,8 @@ for (ArdAppPosition ardAppPosition : data) { ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class); SysUser sysUser = sysUserService.selectUserById(ardAppPosition.getUserId()); - if(StringUtils.isNotNull(sysUser)) { - if(StringUtils.isNotNull(sysUser.getAppOnlineState())) { + if (StringUtils.isNotNull(sysUser)) { + if (StringUtils.isNotNull(sysUser.getAppOnlineState())) { if (sysUser.getAppOnlineState().equals("1")) { onlineList.add(ardAppPosition); } @@ -126,8 +126,7 @@ Map<String, Object> map = JSONObject.parseObject(message, Map.class); if (map.size() > 0) { Boolean enabled = (Boolean) map.get("enabled"); - if(enabled==null) - { + if (enabled == null) { return; } if (enabled) { @@ -177,10 +176,9 @@ AppPositionPushService.tempDataMap.remove(userId); } } - } - catch (Exception ex) - { + } catch (Exception ex) { log.error(ex.getMessage()); + WebSocketUtils.sendMessage(userId, "app浣嶇疆鎺ㄩ�佽В鏋愭秷鎭��" + message + "銆戝紓甯�:" + ex.getMessage()); } } diff --git a/ard-work/src/main/java/com/ruoyi/call/listener/WebsocketHandler.java b/ard-work/src/main/java/com/ruoyi/call/listener/WebsocketHandler.java new file mode 100644 index 0000000..4053708 --- /dev/null +++ b/ard-work/src/main/java/com/ruoyi/call/listener/WebsocketHandler.java @@ -0,0 +1,68 @@ +package com.ruoyi.call.listener; + +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.call.dto.CallMessage; +import com.ruoyi.utils.websocket.util.WebSocketUtils; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 澶勭悊websocket娑堟伅澶勭悊瑙嗛閫氳瘽娑堟伅 + * + * @author liusuyi + * @date 2024骞�08鏈�12鏃�15:56 + **/ +public class WebsocketHandler { + public static void handleMessage(String userId, String message) { + try { + 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; + } + + + } + } + else + { + WebSocketUtils.sendMessage(userId, "瑙嗛閫氳瘽鏃犳硶瑙f瀽娑堟伅銆�" + message + "銆�"); + } + } catch (Exception ex) { + WebSocketUtils.sendMessage(userId, "瑙嗛閫氳瘽瑙f瀽娑堟伅銆�" + message + "銆戝紓甯�:" + ex.getMessage()); + } + } +} diff --git a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java index ca6b465..d796d94 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java +++ b/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); + try { + if(isValidJson(message)) { + // 澶勭悊瑙嗛閫氳瘽娑堟伅 + WebsocketHandler.handleMessage(userId, message); + // 鏍规嵁鐢ㄦ埛鏂扮殑棰戠巼閲嶆柊璋冩暣瀹氭椂浠诲姟 + AppPositionPushService.messageHandler(userId, message); + } else { + // 澶勭悊鍏朵粬娑堟伅 + WebSocketUtils.sendMessage(userId,"Received an invalid JSON message锛�"+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; - } - - - } + } catch (Exception ex) { + WebSocketUtils.sendMessage(userId, "鏃犳硶瑙f瀽娑堟伅銆�" + message + "銆�:" + ex.getMessage()); } - // 鏍规嵁鐢ㄦ埛鏂扮殑棰戠巼閲嶆柊璋冩暣瀹氭椂浠诲姟 - AppPositionPushService.messageHandler(userId, message); - } @OnClose @@ -114,4 +88,20 @@ } log.info("Throwable msg " + throwable.getMessage()); } + + /** + * 妫�鏌ョ粰瀹氱殑瀛楃涓叉槸鍚︿负鏈夋晥鐨凧SON鏍煎紡銆� + * + * @param message 瑕佹鏌ョ殑瀛楃涓� + * @return 濡傛灉鏄湁鏁堢殑JSON瀛楃涓诧紝杩斿洖true锛涘惁鍒欒繑鍥瀎alse銆� + */ + public static boolean isValidJson(String message) { + try { + Object json = JSON.parse(message); + // 纭繚瑙f瀽缁撴灉鏄疛SONObject鎴朖SONArray绫诲瀷 + return (json instanceof JSONObject || json instanceof JSONArray); + } catch (JSONException e) { + return false; // 瑙f瀽澶辫触锛岃鏄庝笉鏄悎娉曠殑JSON + } + } } \ No newline at end of file diff --git a/ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java b/ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java index 18606e1..ab93c42 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java +++ b/ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java @@ -95,7 +95,17 @@ public static void sendMessageAll(String message) { ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, message)); } - + /** + * 鍙戦�佹秷鎭粰鎸囧畾鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛id + * @param message 娑堟伅鍐呭 + * @author 鍒樿嫃涔� + * @date 2024/8/12 15:43 + */ + public static void sendMessage(String userId,String message) { + WebSocketUtils.ONLINE_USER_SESSIONS.get(userId).getAsyncRemote().sendText(message); + } /** * 鎺ㄩ�佹秷鎭埌鍏朵粬瀹㈡埛绔� * -- Gitblit v1.9.3