WebSocket 库 Java:Tyrus — JSR 356 参考实现
在现代 Web 开发中,实时双向通信的需求已成为标准。聊天应用、在线游戏、交易终端和通知系统都要求服务器能够主动向客户端发送数据,而无需持续的 HTTP 请求。对于 Java 生态系统,事实上的标准是 JSR 356(Java API for WebSocket)规范,其参考实现是 Tyrus 库。
在 pythonlib.ru 页面上,我们经常介绍实时通信工具。今天我们将详细解析 Tyrus——一个强大且灵活的 Java WebSocket 库,它能让您轻松地将双向数据交换集成到项目中。
什么是 Tyrus,为什么需要它?
Tyrus 是 JSR 356 规范的开源实现(reference implementation),由 Eclipse Foundation 主导开发。它提供了一整套 API,用于在 Java 中创建服务器端和客户端 WebSocket 应用。Tyrus 的主要优势:
- 完全符合 JSR 356 标准——使用 Tyrus 编写的代码可以轻松移植到其他实现(例如 Apache Tomcat、Jetty)。
- 支持注解——极简方法:只需向 POJO 添加
@ServerEndpoint或@ClientEndpoint注解即可。 - 灵活性——既可在 Servlet 容器(Tomcat、GlassFish)中运行,也可在 standalone 模式(内置 Grizzly 服务器)下运行。
- 安全性——通过标准 Java SSL 套接字支持 WSS(WebSocket Secure)。
安装和配置 Tyrus
要使用 Tyrus,您需要在 pom.xml(Maven)中添加几个依赖项。基本配置包括库核心和传输层(standalone 模式使用 Grizzly):
<!-- Tyrus 核心依赖 --><dependency> <groupId>org.glassfish.tyrus</groupId> <artifactId>tyrus-server</artifactId> <version>1.19</version></dependency>
<!-- standalone 模式的内置 Grizzly 服务器 --><dependency> <groupId>org.glassfish.tyrus</groupId> <artifactId>tyrus-container-grizzly-server</artifactId> <version>1.19</version></dependency>
<!-- 客户端部分(如果需要连接到其他服务器) --><dependency> <groupId>org.glassfish.tyrus</groupId> <artifactId>tyrus-client</artifactId> <version>1.19</version></dependency>对于 Gradle(build.gradle):
implementation 'org.glassfish.tyrus:tyrus-server:1.19'implementation 'org.glassfish.tyrus:tyrus-container-grizzly-server:1.19'implementation 'org.glassfish.tyrus:tyrus-client:1.19'在 Tyrus 上创建 WebSocket 服务器
服务器端是一个带有 @ServerEndpoint 注解的普通 Java 类。Tyrus 自动管理连接的生命周期。
import javax.websocket.*;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;
@ServerEndpoint("/chat")public class ChatEndpoint {
// 存储所有活跃会话 private static final Set<Session> sessions = new CopyOnWriteArraySet<>();
@OnOpen public void onOpen(Session session) { sessions.add(session); System.out.println("新连接: " + session.getId()); broadcast("用户 " + session.getId() + " 加入了聊天。"); }
@OnMessage public void