在现代的 web 应用开发中,WebSocket 提供了一种在客户端和服务器之间进行全双工通信的方式,非常适合实时应用程序。Spring Boot 作为一个流行的框架,提供了非常便利的 WebSocket 支持。本文将详细介绍如何在 Spring Boot 中搭建一个 WebSocket 服务端,并演示如何通过 URL 传递参数连接。
一、搭建环境
确保你的开发环境中已经安装了以下工具: - JDK 11 或更高版本 - Maven - IDE(如 IntelliJ IDEA 或 Eclipse)
二、创建 Spring Boot 项目
- 创建项目目录
使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目,选择依赖项为 Web
和 WebSocket
。
- 导入项目
将下载的项目导入到你的 IDE 中。
三、编写 WebSocket 配置
在项目中创建一个 WebSocket 配置类,用于注册 WebSocket 的终端。
package com.example.websocketdemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler(), "/ws/users").setAllowedOrigins("*");
}
@Bean
public WebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
四、创建 WebSocket 处理器
接下来,我们实现 WebSocket 处理器,用于处理连接、消息等操作。
package com.example.websocketdemo.handler;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class MyWebSocketHandler extends TextWebSocketHandler {
private Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 获取 URL 参数
String userId = session.getUri().getQuery();
System.out.println("用户连接,userId: " + userId);
sessions.put(userId, session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("收到用户消息:" + message.getPayload());
// 这里可以添加逻辑处理消息并回应用户
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
// 处理用户断开连接
System.out.println("用户断开连接");
}
}
五、启动 Spring Boot 应用
在 src/main/java/com/example/websocketdemo/WebsocketdemoApplication.java
中,启动你的 Spring Boot 应用:
package com.example.websocketdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebsocketdemoApplication {
public static void main(String[] args) {
SpringApplication.run(WebsocketdemoApplication.class, args);
}
}
六、前端连接示例
为了测试 WebSocket 服务器,可以使用简单的 HTML 和 JavaScript 来连接。
<!DOCTYPE html>
<html>
<head>
<title>Test WebSocket</title>
</head>
<body>
<h1>WebSocket 测试</h1>
<script>
const userId = "1234"; // 假设这是要传递的参数
const ws = new WebSocket(`ws://localhost:8080/ws/users?userId=${userId}`);
ws.onopen = () => {
console.log('连接已建立');
ws.send('Hello from client!');
};
ws.onmessage = (event) => {
console.log('收到消息:', event.data);
};
ws.onclose = () => {
console.log('连接已关闭');
};
</script>
</body>
</html>
七、运行应用
- 启动 Spring Boot 应用后,打开你的浏览器,访问上述 HTML 文件。
- 打开浏览器的开发者工具(F12),你应该能看到连接建立和收到消息的日志。
总结
通过以上步骤,我们成功搭建了一个 WebSocket 服务端,并实现了通过 URL 传递参数的连接。这个范例展示了 WebSocket 的基本用法,你可以在此基础上扩展更多功能,例如处理多用户会话、广播消息等。WebSocket 是实现实时通信的强大工具,在开发实时聊天、游戏、财务监控等应用时非常有用。