Skip to content

SpringBoot集成WebSocket

1. 添加依赖

首先,在你的pom.xml文件中添加以下依赖:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

如果你使用的是Gradle,那么在build.gradle中添加如下依赖:

shell
implementation 'org.springframework.boot:spring-boot-starter-websocket'

2. 配置WebSocket

在Spring Boot中,你需要配置一个WebSocketConfigurer来启用WebSocket。但是,由于Spring Boot自动配置了大部分内容,你通常不需要显式地配置它。然而,如果你想自定义一些设置,例如改变默认的端点,你可以创建一个配置类并实现WebSocketConfigurer接口。

java
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWebSocketHandler(), "/ws/chat").setAllowedOrigins("*");
    }

    @Bean
    public TextWebSocketHandler myWebSocketHandler() {
        return new MyWebSocketHandler();
    }
}

这里,/ws/chat是WebSocket的端点,MyWebSocketHandler是你自定义的消息处理器。

3. 创建WebSocket处理器

你需要创建一个处理WebSocket消息的类,这个类需要继承TextWebSocketHandlerWebSocketHandler。下面是一个简单的例子:

java
@Component
public class MyWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        System.out.println("Received: " + payload);
        session.sendMessage(new TextMessage("Echo: " + payload));
    }
}

这个处理器会接收文本消息,并将接收到的消息回传给客户端。

4. 客户端连接

客户端可以使用标准的WebSocket API来连接到服务器。例如,JavaScript客户端代码可能如下所示:

javascript
var socket = new WebSocket('ws://localhost:8080/ws/chat');
socket.onmessage = function(event) {
    console.log('Received: ', event.data);
};
socket.send('Hello Server!');

5. 启用Simp支持(可选)

如果你想使用更高级的功能,如广播和订阅,你可以使用Spring的Simp框架。这需要在pom.xml中添加spring-boot-starter-websocket依赖,并在配置类中启用Simp。

java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWebSocketHandler(), "/ws/chat").withSockJS();
    }

    @Bean
    public MyWebSocketHandler myWebSocketHandler() {
        return new MyWebSocketHandler();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
}

这样,你就可以使用@MessageMapping@SubscribeMapping注解来处理消息和订阅主题了。