本文介绍如何使用 Spring Boot 的注解方式实现一个简单的 WebSocket 服务,支持客户端与服务器之间进行实时通信。
1. 引入依赖
在 pom.xml 文件中添加 WebSocket 相关依赖。
<dependencies>
<!-- Spring Boot WebSocket 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
2.创建 WebSocket 服务类
使用 @ServerEndpoint 注解定义 WebSocket 的处理逻辑。下面是一个简单的示例类,它处理客户端连接、消息接收和消息发送。
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
@ServerEndpoint("/ws")
public class WebSocketServer {
// 用于存储所有的会话
private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
private Session session;
// 连接建立成功调用的方法
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this);
System.out.println("新连接加入: " + session.getId());
}
// 连接关闭时调用的方法
@OnClose
public void onClose() {
webSocketSet.remove(this);
System.out.println("连接关闭: " + session.getId());
}
// 收到客户端消息时调用的方法
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("收到消息: " + message);
broadcast("服务器: " + message); // 广播消息给所有客户端
}
// 发送消息给客户端
private void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
// 广播消息给所有客户端
private static void broadcast(String message) {
for (WebSocketServer webSocket : webSocketSet) {
try {
webSocket.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3. WebSocket 配置类
在 Spring Boot 中,需要通过配置类注册 WebSocket 端点。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
// 自动注册使用 @ServerEndpoint 注解声明的 WebSocket 端点
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
4. 编写前端客户端代码
为了测试 WebSocket 服务,可以通过一个简单的 HTML 文件与 WebSocket 服务进行交互。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Test</title>
</head>
<body>
<h2>WebSocket 测试</h2>
<input id="messageInput" type="text" placeholder="输入消息">
<button onclick="sendMessage()">发送</button>
<ul id="messages"></ul>
<script>
let socket = new WebSocket("ws://localhost:8080/ws");
socket.onmessage = function(event) {
let messages = document.getElementById("messages");
let messageItem = document.createElement("li");
messageItem.textContent = event.data;
messages.appendChild(messageItem);
};
function sendMessage() {
let input = document.getElementById("messageInput");
let message = input.value;
socket.send(message);
input.value = '';
}
</script>
</body>
</html>
5. 启动应用程序
完成以上步骤后,启动 Spring Boot 应用程序。WebSocket 服务将会运行在 ws://localhost:8080/ws,前端可以通过该地址与服务器进行实时通信。
6. 测试 WebSocket
启动应用程序后,打开前端 HTML 页面。
输入消息并点击发送按钮,服务器会收到消息并将其广播给所有连接的客户端。
在浏览器开发工具中也可以观察到 WebSocket 的实时消息交互。