MST

星途 面试题库

面试题:网络编程之Spring Boot整合WebSocket基础

在Spring Boot整合WebSocket实现实时通信中,简述如何配置WebSocket的连接端点以及消息处理机制。
12.1万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

配置WebSocket连接端点

  1. 创建配置类: 创建一个继承自WebSocketConfigurer的配置类,例如WebSocketConfig。在Spring Boot中,可使用@Configuration注解标记该类,表明这是一个配置类。
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 {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // 配置消息代理前缀,客户端发送消息到带有该前缀的目的地,服务端会将其转发到对应的消息代理
        config.setApplicationDestinationPrefixes("/app");
        // 配置订阅前缀,服务端发送消息到带有该前缀的目的地,客户端可订阅这些目的地接收消息
        config.enableSimpleBroker("/topic", "/queue"); 
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 注册STOMP协议的端点,客户端通过这个端点连接WebSocket
        registry.addEndpoint("/websocket-endpoint").withSockJS(); 
    }
}
  1. @EnableWebSocketMessageBroker注解: 启用WebSocket消息代理功能,使得应用程序能够处理基于STOMP协议的WebSocket消息。

  2. registerStompEndpoints方法

  • addEndpoint方法用于添加WebSocket端点。这里/websocket - endpoint是自定义的端点路径,客户端将通过这个路径连接到WebSocket服务。
  • .withSockJS()表示为该端点启用SockJS fallback机制。SockJS是一个JavaScript库,它提供了跨浏览器的WebSocket通信抽象,当浏览器不支持原生WebSocket时,SockJS会自动降级使用其他技术(如XHR流、JSONP轮询等)来模拟WebSocket的功能,以确保实时通信的兼容性。

消息处理机制

  1. 创建消息处理类: 创建一个带有@Controller注解的类来处理接收到的消息,例如WebSocketController
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class WebSocketController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public String handleHelloMessage(String message) {
        return "Hello, " + message + "!";
    }
}
  1. @MessageMapping注解: 类似于Spring MVC中的@RequestMapping,用于映射WebSocket消息的目的地。这里/hello是消息的目的地,当客户端向/app/hello/app是之前配置的应用程序目的地前缀)发送消息时,handleHelloMessage方法将被调用。

  2. @SendTo注解: 指定消息处理方法处理完消息后,将返回值发送到的目的地。这里/topic/greetings表示处理后的消息将被发送到以/topic/greetings为目的地的订阅者(客户端通过订阅/topic/greetings来接收该消息)。

  3. 消息代理转发: Spring Boot通过消息代理来转发消息。当客户端发送消息到带有/app前缀的目的地时,Spring会查找对应的@MessageMapping注解的方法来处理消息。处理完成后,若有@SendTo注解,消息会被发送到指定的目的地,由消息代理转发给订阅该目的地的客户端。如果消息是发送到/topic/queue前缀的目的地,消息代理会直接将消息转发给相应的订阅者。