引言:为什么WebSocket成为实时通信的标准
现代Web应用需要对事件做出即时响应。无论是聊天、股票交易终端还是多人在线游戏——用户都期望数据无需刷新页面即可更新。传统的HTTP(REST API)及其“请求-响应”模式对于此类任务效率低下:客户端必须不断轮询服务器(polling),这会造成额外的负载和延迟。
解决这个问题的方案是WebSocket协议,它在客户端和服务器之间建立持久的双向连接。在本文中,我们将从基础开始,深入讲解Java上的WebSocket,直到创建一个完整的实时应用。您将学习如何配置服务器、编写客户端以及处理错误。
WebSocket基础:它是如何工作的
与HTTP的区别
WebSocket是一种基于TCP的协议。它以一个HTTP请求(握手)开始,之后连接“升级”(upgrade)为持久的双向通道。与HTTP不同,HTTP的每个请求都需要一个新连接,而WebSocket保持连接打开,允许服务器主动向客户端发送数据(推送模型)。
主要优势:
- 低延迟——数据无需重复握手即可即时传输。
- 更少的流量——最小头部(仅2-14字节),而HTTP头部有数百字节。
- 双向性——客户端和服务器都可以发起数据发送。
Java实时应用的架构
典型的应用由三个组件组成:
- 客户端(浏览器或移动应用),发起连接。
- 应用服务器(Java),管理WebSocket会话。
- 后端(数据库、消息队列),处理业务逻辑。
Java提供了强大的WebSocket工具——既包括服务器端(Jakarta WebSocket, Spring WebSocket),也包括客户端(标准Java WebSocket API)。
在Java上创建WebSocket服务器
环境准备
对于服务器端,我们将使用Jakarta WebSocket(以前称为Java EE WebSocket)。这是一个标准API,是Jakarta EE的一部分。您需要:
- JDK 11或更高版本。
- 应用服务器(例如Apache Tomcat 10或GlassFish 7)。
- Maven用于管理依赖。
在pom.xml中添加依赖:
<dependency> <groupId>jakarta.websocket</groupId> <artifactId>jakarta.websocket-api</artifactId> <version>2.1.0</version> <scope>provided</scope></dependency>编写WebSocket端点
让我们创建一个简单的回声服务器,它发回接收到的消息:
import jakarta.websocket.*;import jakarta.websocket.server.ServerEndpoint;
@ServerEndpoint("/chat")public class ChatEndpoint {
@OnOpen public void onOpen(Session session) { System.out.println("新连接: " + session.getId()); }
@OnMessage public String onMessage(String message, Session session) { System.out.println("从 " + session.getId() + " 收到: " + message); return "回声: " + message; }
@OnClose public void onClose(Session session, CloseReason reason) { System.out.println("连接已关闭: " + session.getId() + " 原因: " + reason.getReasonPhrase()); }
@OnError public void onError(Session session, Throwable error) { System.err.println("会话 " + session.getId() + " 出错: " + error.getMessage()); }}注解@ServerEndpoint("/chat")
博客
书籍推荐
推荐阅读