From c83db8d9278ed2b9abc747b07676368b82ceef98 Mon Sep 17 00:00:00 2001 From: Doubleyin <953994191@qq.com> Date: Thu, 16 Oct 2025 22:38:10 +0800 Subject: [PATCH] =?UTF-8?q?webusocket=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delivery/config/WebsocketConfig.java | 6 ++++- .../service/LocationWebSocketHandler.java | 24 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/light/delivery/config/WebsocketConfig.java b/src/main/java/com/light/delivery/config/WebsocketConfig.java index db0523a..78a2f14 100644 --- a/src/main/java/com/light/delivery/config/WebsocketConfig.java +++ b/src/main/java/com/light/delivery/config/WebsocketConfig.java @@ -1,6 +1,7 @@ package com.light.delivery.config; import com.light.delivery.service.LocationWebSocketHandler; +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; @@ -10,10 +11,13 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry @EnableWebSocket public class WebsocketConfig implements WebSocketConfigurer { + @Autowired + private LocationWebSocketHandler locationWebSocketHandler; + @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { // 注册位置同步处理器 - registry.addHandler(new LocationWebSocketHandler(), "/ws/location") + registry.addHandler(locationWebSocketHandler, "/ws/location") .setAllowedOrigins("*"); } } \ No newline at end of file diff --git a/src/main/java/com/light/delivery/service/LocationWebSocketHandler.java b/src/main/java/com/light/delivery/service/LocationWebSocketHandler.java index 16a6212..c78af5e 100644 --- a/src/main/java/com/light/delivery/service/LocationWebSocketHandler.java +++ b/src/main/java/com/light/delivery/service/LocationWebSocketHandler.java @@ -81,7 +81,12 @@ public class LocationWebSocketHandler extends TextWebSocketHandler { } } catch (Exception e) { System.err.println("处理WebSocket消息时出错: " + e.getMessage()); - session.sendMessage(new TextMessage("{\"error\":\"消息处理失败\"}")); + // 确保不因异常导致连接关闭 + try { + session.sendMessage(new TextMessage("{\"error\":\"消息处理失败\"}")); + } catch (IOException ioException) { + System.err.println("发送错误消息时出错: " + ioException.getMessage()); + } } } @@ -116,8 +121,8 @@ public class LocationWebSocketHandler extends TextWebSocketHandler { if (deliveryPersonId != null) { sessions.put(deliveryPersonId, session); // 默认状态为未签到 - deliveryPersonStatus.put(deliveryPersonId, false); - lastUpdateTimes.put(deliveryPersonId, System.currentTimeMillis()); + deliveryPersonStatus.putIfAbsent(deliveryPersonId, false); + lastUpdateTimes.putIfAbsent(deliveryPersonId, System.currentTimeMillis()); session.sendMessage(new TextMessage("{\"type\":\"subscribed\",\"deliveryPersonId\":" + deliveryPersonId + "}")); } } @@ -171,8 +176,16 @@ public class LocationWebSocketHandler extends TextWebSocketHandler { WebSocketSession session = entry.getValue(); // 只发送给已签到的配送员 - if (session.isOpen() && Boolean.TRUE.equals(deliveryPersonStatus.get(deliveryPersonId))) { - session.sendMessage(textMessage); + if (session != null && session.isOpen() && Boolean.TRUE.equals(deliveryPersonStatus.get(deliveryPersonId))) { + try { + session.sendMessage(textMessage); + } catch (IOException e) { + System.err.println("向配送员 " + deliveryPersonId + " 发送消息时出错: " + e.getMessage()); + // 移除已断开的连接 + sessions.remove(deliveryPersonId); + deliveryPersonStatus.remove(deliveryPersonId); + lastUpdateTimes.remove(deliveryPersonId); + } } } } @@ -198,6 +211,7 @@ public class LocationWebSocketHandler extends TextWebSocketHandler { deliveryPersonStatus.remove(deliveryPersonId); lastUpdateTimes.remove(deliveryPersonId); } + // 不要关闭session,因为可能已经关闭了 } /**