diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java index 89618e92..7a19eb30 100644 --- a/src/main/java/com/youlai/system/config/WebSocketConfig.java +++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java @@ -9,24 +9,46 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo /** * WebSocket 配置类 + *
+ * STOMP 不是一个传输协议,而是一个简单的文本消息协议,定义消息格式和交换规则 * * @author haoxr * @since 2.3.0 */ @Configuration @ConditionalOnProperty(name = "system.config.websocket-enabled")// system.config.websocket-enabled = true 才会自动装配 -@EnableWebSocketMessageBroker // 注解告诉Spring框架要开启WebSocket消息代理的功能,并配置相关的端点和消息代理 +@EnableWebSocketMessageBroker // 启用WebSocket消息代理功能和配置STOMP协议,实现实时双向通信和消息传递 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - @Override - public void configureMessageBroker(MessageBrokerRegistry registry) { - registry.enableSimpleBroker("/topic", "/user"); - } - + /** + * 配置和注册WebSocket端点(endpoints) + */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { - // 注册了一个 /ws 的端点,用于建立WebSocket连接。 - registry.addEndpoint("/ws").setAllowedOriginPatterns("*"); + registry + .addEndpoint("/ws") // 注册了一个 /ws 的端点 + .setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接 + .withSockJS() // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持) + ; } + + + /** + * 配置消息代理(Message Broker) + *
+ * 设置消息传输的规则和前缀 + */ + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 客户端发送消息的请求前缀 + registry.setApplicationDestinationPrefixes("/app"); + + // 客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送 + registry.enableSimpleBroker("/topic", "/queue"); + + // 服务端通知客户端的前缀,可以不设置,默认为user + registry.setUserDestinationPrefix("/user"); + } + } diff --git a/src/main/java/com/youlai/system/controller/WebsocketController.java b/src/main/java/com/youlai/system/controller/WebsocketController.java index 3f7462f6..b1c21418 100644 --- a/src/main/java/com/youlai/system/controller/WebsocketController.java +++ b/src/main/java/com/youlai/system/controller/WebsocketController.java @@ -1,6 +1,5 @@ package com.youlai.system.controller; -import cn.hutool.json.JSONUtil; import com.youlai.system.common.result.Result; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -48,13 +47,12 @@ public class WebsocketController { /** * 点对点发送消息 * - * @param userId 用户ID + * @param username 用户名 */ - @PostMapping("/sendToUser/{userId}") - public Result sendToUser(@PathVariable Long userId, String message) { - log.info("【点对点请求接收】用户:{};消息:{}", userId, JSONUtil.toJsonStr(message)); + @PostMapping("/sendToUser/{username}") + public Result sendToUser(@PathVariable String username) { // 发送主题目的(destination)= /user/{userId}/message - messagingTemplate.convertAndSendToUser(String.valueOf(userId), "/message", message); + messagingTemplate.convertAndSendToUser(username, "/queue/user", "hello "+username); return Result.success("点对点消息发送成功"); }