Java上的WebSocket:从A到Z的实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么WebSocket成为实时通信的标准

现代Web应用需要对事件做出即时响应。无论是聊天、股票交易终端还是多人在线游戏——用户都期望数据无需刷新页面即可更新。传统的HTTP(REST API)及其“请求-响应”模式对于此类任务效率低下:客户端必须不断轮询服务器(polling),这会造成额外的负载和延迟。

解决这个问题的方案是WebSocket协议,它在客户端和服务器之间建立持久的双向连接。在本文中,我们将从基础开始,深入讲解Java上的WebSocket,直到创建一个完整的实时应用。您将学习如何配置服务器、编写客户端以及处理错误。



WebSocket基础:它是如何工作的

与HTTP的区别

WebSocket是一种基于TCP的协议。它以一个HTTP请求(握手)开始,之后连接“升级”(upgrade)为持久的双向通道。与HTTP不同,HTTP的每个请求都需要一个新连接,而WebSocket保持连接打开,允许服务器主动向客户端发送数据(推送模型)。

主要优势:

  • 低延迟——数据无需重复握手即可即时传输。
  • 更少的流量——最小头部(仅2-14字节),而HTTP头部有数百字节。
  • 双向性——客户端和服务器都可以发起数据发送。


Java实时应用的架构

典型的应用由三个组件组成:

  1. 客户端(浏览器或移动应用),发起连接。
  2. 应用服务器(Java),管理WebSocket会话。
  3. 后端(数据库、消息队列),处理业务逻辑。

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")

博客

书籍推荐