主要配置步骤
- 添加依赖:
在
pom.xml
文件中添加Spring 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-messaging</artifactId>
</dependency>
- 配置WebSocket:
创建一个配置类,继承
WebSocketConfigurer
接口,并实现registerWebSocketHandlers
方法。
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 registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket-endpoint").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.setApplicationDestinationPrefixes("/app");
config.setUserDestinationPrefix("/user");
config.enableSimpleBroker("/topic", "/queue");
}
}
- 创建消息处理逻辑:
创建一个控制器来处理客户端发送的消息,并向特定目的地发送消息。
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 + "!";
}
}
- 前端集成:
在前端页面中使用JavaScript和SockJS来连接WebSocket服务器并发送/接收消息。
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Example</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
</head>
<body>
<input type="text" id="messageInput" placeholder="Enter message">
<button onclick="sendMessage()">Send</button>
<div id="messageOutput"></div>
<script>
var socket = new SockJS('/websocket-endpoint');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(message) {
document.getElementById('messageOutput').innerHTML += message.body + '<br>';
});
});
function sendMessage() {
var message = document.getElementById('messageInput').value;
stompClient.send('/app/hello', {}, message);
document.getElementById('messageInput').value = '';
}
</script>
</body>
</html>
关键类或注解
- @EnableWebSocketMessageBroker:
开启使用STOMP协议来传输基于代理(broker)的消息,支持简单的消息代理和用户目的地等功能。
- WebSocketConfigurer:
用于配置WebSocket相关的设置,实现
registerWebSocketHandlers
方法来注册WebSocket端点。
- StompEndpointRegistry:
在
registerWebSocketHandlers
方法中使用,用于注册STOMP端点,支持SockJS回退选项。
- MessageBrokerRegistry:
在
configureMessageBroker
方法中使用,用于配置消息代理的前缀、用户目的地前缀等。
- @MessageMapping:
类似于
@RequestMapping
,用于将客户端发送到特定目的地的消息映射到控制器方法。
- @SendTo:
将控制器方法的返回值发送到指定的目的地,通常与
@MessageMapping
一起使用。