WebSocket 是 HTML5 中的一个新协议,它实现了浏览器与服务器全双工通信(full-duplex communication),使得客户端和服务器端可以随时相互推送数据。而 Spring Boot 提供了对 WebSocket 的支持,让我们可以轻松地在 Web 应用程序中使用 WebSocket 技术。本文将带你从入门到实战,深入了解 Spring Boot WebSocket。
一、什么是 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它可以在客户端和服务器之间建立一个长连接,使得客户端和服务器之间可以随时相互推送数据。与传统的 HTTP 协议相比,WebSocket 具有更低的延迟和更高的实时性,因此广泛应用于在线聊天、股票行情、游戏等领域。
二、WebSocket 的常见用途
- 在线聊天
- 股票行情
- 游戏
- 实时监控
- 即时通讯
- 门店实时系统
三、 Spring Boot WebSocket 的使用
- 添加依赖
首先,在 pom.xml 中添加 spring-boot-starter-websocket 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 创建 WebSocketHandler
在 WebSocketHandler 中定义处理消息的逻辑。具体实现可以参考下面的代码:
@Component
public class MyWebSocketHandler extends TextWebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(MyWebSocketHandler.class);
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
logger.info("Received message: {}", message.getPayload());
session.sendMessage(new TextMessage("Hello, " + message.getPayload() + "!"));
}
}
在上面的代码中,我们通过继承 TextWebSocketHandler 类来创建 WebSocketHandler。在 handleTextMessage 方法中,我们通过 WebSocketSession 对象来处理客户端发送的消息,并将处理结果返回给客户端。
- 配置 WebSocket
接下来,在 Spring Boot 的配置类中添加 WebSocket 配置。具体实现可以参考下面的代码:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private MyWebSocketHandler myWebSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler, "/websocket").setAllowedOrigins("*");
}
}
在上面的代码中,我们首先通过 @Configuration 和 @EnableWebSocket 注解来启用 WebSocket 功能。然后,我们通过实现 WebSocketConfigurer 接口来注册 WebSocketHandler。在 registerWebSocketHandlers 方法中,我们将 MyWebSocketHandler 对象注册到 /websocket 路径下,并设置允许跨域请求。
- 编写客户端代码
最后,我们需要编写一个客户端代码来连接 WebSocket 服务器,并发送和接收消息。具体实现可以参考下面的代码:
var webSocket = new WebSocket("ws://localhost:8080/websocket");
webSocket.onopen = function(event) {
console.log("WebSocket opened: " + event);
webSocket.send("World");
};
webSocket.onmessage = function(event) {
console.log("Received message: " + event.data);
webSocket.close();
};
在上面的代码中,我们首先创建了一个 WebSocket 对象,并连接到 WebSocket 服务器。在 onopen 回调方法中,我们发送一条消息给服务器。在 onmessage 回调方法中,我们接收服务器发送的消息,并关闭 WebSocket 连接。
四、 实战案例:Spring Boot WebSocket 的在线聊天室
下面我们将通过一个实战案例来演示如何在 Spring Boot 中使用 WebSocket 实现在线聊天室功能。具体实现可以参考下面的代码:
@Controller
public class ChatController {
private static final Logger logger = LoggerFactory.getLogger(ChatController.class);
private Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());
@GetMapping("/")
public String index() {
return "index";
}
@MessageMapping("/message")
@SendTo("/topic/messages")
public Message message(@Payload Message message) throws Exception {
logger.info("Received message: {}", message);
return message;
}
@EventListener
public void handleWebSocketConnect(SessionConnectedEvent event) {
WebSocketSession session = (WebSocketSession) event.getSource();
sessions.add(session);
logger.info("WS Session connected: {}", session);
}
@EventListener
public void handleWebSocketDisconnect(SessionDisconnectEvent event) {
WebSocketSession session = (WebSocketSession) event.getSource();
sessions.remove(session);
logger.info("WS Session disconnected: {}", session);
}
@ResponseBody
@RequestMapping("/count")
public int count() {
return sessions.size();
}
}
在上面的代码中,我们首先定义了一个 ChatController 类,用于处理 WebSocket 请求。在 index 方法中,我们返回了一个 HTML 页面,用于显示在线聊天室界面。
在 message 方法中,我们使用 @MessageMapping 注解来处理客户端发送的消息,并使用 @SendTo 注解将处理结果广播给所有客户端。在 handleWebSocketConnect 和 handleWebSocketDisconnect 方法中,我们分别处理 WebSocket 的连接和断开事件,并将连接的 WebSocketSession 对象保存到 sessions 集合中。
最后,在 count 方法中,我们返回当前在线用户数。
五、 总结
通过本文的介绍,我们了解了 WebSocket 的基本概念和常见用途。并深入学习了在 Spring Boot 中使用 WebSocket 的具体实现方法。特别是通过实战案例,我们更加深刻地理解了如何在 Spring Boot 中实现一个完整的在线聊天室应用程序。希望这篇文章对你有所帮助!