下面是一个使用 STOMP 协议的 Spring Boot 应用示例,包含三个 WebSocket 端点。每个端点都有特定的功能。代码中包含中文注释,帮助你理解每个部分的作用。
1. 添加依赖
首先,确保在 pom.xml
中添加了 WebSocket 和 Spring Messaging 的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 配置 WebSocket 和 STOMP
创建一个配置类来注册多个 WebSocket 端点:
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {// 配置消息代理,启用简单代理,支持/topic和/queueconfig.enableSimpleBroker("/topic", "/queue");// 设置应用程序目的地前缀config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// 注册三个不同的WebSocket端点,支持SockJSregistry.addEndpoint("/ws-endpoint1").withSockJS();registry.addEndpoint("/ws-endpoint2").withSockJS();registry.addEndpoint("/ws-endpoint3").withSockJS();}
}
3. 创建控制器
创建一个控制器来处理不同的消息:
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;@Controller
public class MessageController {// 处理来自客户端的消息,路径为/app/message1@MessageMapping("/message1")// 将处理结果发送到/topic/messages1@SendTo("/topic/messages1")public String handleMessage1(String message) {return "Endpoint1: " + message;}// 处理来自客户端的消息,路径为/app/message2@MessageMapping("/message2")// 将处理结果发送到/topic/messages2@SendTo("/topic/messages2")public String handleMessage2(String message) {return "Endpoint2: " + message;}// 处理来自客户端的消息,路径为/app/message3@MessageMapping("/message3")// 将处理结果发送到/topic/messages3@SendTo("/topic/messages3")public String handleMessage3(String message) {return "Endpoint3: " + message;}
}
4. 客户端示例
在客户端(例如,使用 JavaScript)中,连接到不同的 WebSocket 端点:
function connectToEndpoint(endpoint, messagePath, subscriptionPath) {const socket = new SockJS(endpoint);const stompClient = Stomp.over(socket);stompClient.connect({}, function (frame) {console.log('已连接到 ' + endpoint + ': ' + frame);// 订阅主题stompClient.subscribe(subscriptionPath, function (message) {console.log('收到消息: ' + message.body);});// 发送消息到服务器stompClient.send(messagePath, {}, "来自 " + endpoint + " 的消息");});
}// 连接到每个端点
connectToEndpoint('/ws-endpoint1', '/app/message1', '/topic/messages1');
connectToEndpoint('/ws-endpoint2', '/app/message2', '/topic/messages2');
connectToEndpoint('/ws-endpoint3', '/app/message3', '/topic/messages3');
代码解释
-
WebSocketConfig:配置类用于注册 WebSocket 端点和配置消息代理。
enableSimpleBroker("/topic", "/queue")
:启用简单的内存消息代理,支持/topic
和/queue
作为消息目的地。setApplicationDestinationPrefixes("/app")
:设置应用程序目的地前缀,客户端发送的消息路径应以/app
开头。registerStompEndpoints
:注册三个 WebSocket 端点,支持 SockJS。
-
MessageController:控制器类处理来自客户端的消息。
@MessageMapping
:映射客户端发送的消息路径。@SendTo
:指定处理后的消息发送到的目的地。
-
客户端代码:使用 SockJS 和 STOMP.js 连接到 WebSocket 端点,订阅主题并发送消息。
通过这种方式,你可以在 Spring Boot 中配置多个 WebSocket 端点,并处理来自不同端点的消息。每个端点和消息路径都有特定的功能,便于扩展和管理。