Java EE 7 中的 WebSocket 客户端 API

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

在这篇博文中,让我们探讨较少讨论的 Web Socket Client API 以及如何在 Java EE 7 容器本身中利用它

Web 套接字服务器 API 规则

JSR 356 (Java 的 Web 套接字 API)的服务器端 API 最常用于构建 Web 套接字端点实现。通常,从客户端的角度来看,基于 HTML5(浏览器)的客户端利用标准的 JavaScript Web Socket API,这些客户端将自己附加到 Web 套接字服务器端点并享受双向和全双工通信。您会看到常见的示例,例如实时地图、股票行情、游戏、屏幕共享等应用程序——所有这些用例都非常适合 Web 套接字,而 Java EE 7 是构建可扩展的 Web 套接字驱动后端的理想平台。

Web Socket 客户端 API 怎么样?

Web Socket 规范还包括一个客户端 API,它强制要求所有 JSR 356(例如 Tyrus Undertow 等)实现提供一个。有很多用例 可能不需要 基于浏览器/面向最终用户的 Web 套接字客户端。

例子

考虑一个场景,您想要连接到第三方 Web Socket 端点,使用它的信息并保留它以备后用?也许需要进一步分析?在这种情况下,在 Java EE 容器本身中利用客户端 API 很有用。

让我们用一个简单的例子来探讨这个问题。

(注释)Web Socket 客户端

注意: @OnMessage 的逻辑被故意排除,并以不同的方式实现(稍后澄清)


 package blog.abhirockzz.wordpress.com;

import javax.websocket.ClientEndpoint; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.Session;

@ClientEndpoint public class StockTickerClient {

@OnClose
public void closed(Session session) {
    System.out.println("Session " + session + " closed");

}

@OnError
public void error(Throwable error) {
    System.out.println("Error: " + error.getMessage());

}

}


股票代码(信息)JPA 实体


 package blog.abhirockzz.wordpress.com;

import javax.websocket.ClientEndpoint; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.Session;

@ClientEndpoint public class StockTickerClient {

@OnClose
public void closed(Session session) {
    System.out.println("Session " + session + " closed");

}

@OnError
public void error(Throwable error) {
    System.out.println("Error: " + error.getMessage());

}

}


一个无状态的bean

  • 处理股票代码信息的持久性
  • 针对 Java EE 7 容器提供的默认 JDBC 数据源执行其操作( 约定优于配置 !)

 package blog.abhirockzz.wordpress.com;

import javax.websocket.ClientEndpoint; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.Session;

@ClientEndpoint public class StockTickerClient {

@OnClose
public void closed(Session session) {
    System.out.println("Session " + session + " closed");

}

@OnError
public void error(Throwable error) {
    System.out.println("Error: " + error.getMessage());

}

}


单例 EJB

  • 利用 Web Socket ContainerProvider API
  • 启动与 Web 套接字服务器的连接
  • 注入 StockInfoPersistenceService bean 并在 addMessageHandler 实现中使用它

根据之前的说明,此处包含了本可以嵌入到 StockTickerClient 类中的 @OnMessage 注释方法中的(持久性)逻辑。这是因为 StockInfoPersistenceService (无状态)bean 的注入失败并且实例本身被解析为 null。


 package blog.abhirockzz.wordpress.com;

import javax.websocket.ClientEndpoint; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.Session;

@ClientEndpoint public class StockTickerClient {

@OnClose
public void closed(Session session) {
    System.out.println("Session " + session + " closed");

}

@OnError
public void error(Throwable error) {
    System.out.println("Error: " + error.getMessage());

}

}


差不多就是这样。尽管这是一个相对简单的示例,但不难想象可以对 Web 套接字服务器端点接收到的信息应用任何类型的复杂业务逻辑。您可能还想考虑使用 session.getAsyncRemote#sendAsync 方法以异步方式向连接的客户端发送消息

相关文章