WebSocket 在 Java 中的入门指南:从理论到实时应用
现代 Web 应用程序越来越需要客户端与服务器之间的即时数据交换。传统的 HTTP 采用"请求-响应"模式,并不适合需要持续连接的任务:在线聊天、股票报价、多人游戏或监控仪表板。这时 WebSocket 协议便派上用场,它建立了一种永久的双向连接。在本文中,我们将探讨如何在 Java 中实现 WebSocket,创建一个简单的聊天服务器和客户端,并讨论生产环境的最佳实践。
什么是 WebSocket 以及为何选择 Java?
WebSocket 是一种基于 TCP 运行的协议,能够实现实时消息交换,而无需 HTTP 标头的开销。在完成握手(从 HTTP 升级到 WebSocket)之后,服务器和客户端可以随时相互发送数据。Java 是实现 WebSocket 的绝佳选择,原因如下:
- 内置支持:Jakarta EE(原 Java EE)通过 JSR 356 提供了支持。
- 高性能与多线程能力。
- 丰富的框架生态(Spring、Netty、Tyrus),可简化开发。
与轮询和SSE(服务器发送事件)不同,WebSocket 提供全双工通信,且无延迟。
Java 中 WebSocket 应用的架构
一个典型的 Java 实时应用包含三个组件:
- WebSocket 服务器 — 接受连接、管理会话、处理传入消息。
- WebSocket 客户端 — 浏览器(JavaScript)或本机 Java 应用程序发起连接。
- 业务逻辑 — 消息处理、广播、数据库持久化。
我们来看看如何通过 Jakarta WebSocket 注解实现服务器,并使用 JavaScript 实现客户端。
服务器端:@ServerEndpoint 注解
要创建服务器,只需添加 jakarta.websocket-api 依赖(较旧版本使用 javax.websocket-api)。以下是一个简单回显服务器的示例:
import jakarta.websocket.*;import jakarta.websocket.server.ServerEndpoint;import java.io.IOException;
@ServerEndpoint("/echo")public class EchoEndpoint {
@OnOpen public void onOpen(Session session) { System.out.println("新连接:" + session.getId()); }
@OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println("收到消息:" + message); // 发送回执(回显) session.getBasicRemote().sendText("回显:" + message); }
@OnClose public void onClose(Session session, CloseReason reason) { System.out.println("连接关闭:" + reason.getReasonPhrase()); }
@OnError public void onError(Session session, Throwable error) { error.printStackTrace(); }}该服务器可部署在任何 Servlet 容器中(Tomcat、Jetty、GlassFish)。若使用 Spring Boot,可将 @ServerEndpoint 与 SpringBootApplication 结合使用。
客户端:JavaScript
浏览器客户端通过标准的 WebSocket API 进行连接:
const socket = new WebSocket("ws://localhost:8080/echo");
socket.onopen = function(event) { console.log("连接已建立"); socket.send("你好,服务器!");};
socket.onmessage = function(event) { console.log("来自服务器的消息:" + event.data);};
socket.onclose = function(event) { console.log("连接已关闭");};注意 URL 以 ws:// 开头(安全连接使用 wss://)。
用 Java 创建实时聊天
现在我们来构建一个完整