写点什么

浅析 Java EE 7 的 WebSocket 支持

  • 2013-07-01
  • 本文字数:1609 字

    阅读完需:约 5 分钟

Java EE 7 引入了一系列新的 API 并修改了部分既有的 API 以满足 web 开发者使用 HTML5 的相关需求。这些新的 API 主要由三个方面组成:处理 JSON 的新 API、针对JSF 的新属性处理的重大更新以及支持WebSocket 协议(组成HTML5 的众多技术之一)的最新API。

WebSocket 协议改变了 web 服务器响应客户端请求的方式:新方式取代了原来关闭连接的方式,服务器将返回 101 状态码并将连接保持在打开状态,该协议期望达到的效果是消息可以在流上读取也可以被写入到流中。它与 HTTP 不同,该协议支持全双工通信,所以客户端(通常是浏览器)和服务器之间可以在同一时间互相发送消息。

WebSocket 协议通过 IETF RFC 6455 进行定义。

为了建立 WebSocket 连接,客户端会向服务器发起一个 WebSocket 握手请求,而服务器将会作出响应,如下面的例子所示:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

一旦握手成功后,客户端和服务器便处于连接状态并成为了对等的两个节点(peer);双方都可以发送或接收消息,以及终止本次连接。

我们通常使用 JavaScript 并结合由 W3C 定义的相关 API 来处理 WebSocket 客户端。Java WebSocket 应用由 WebSocket 端点(endpoint)构成,该端点是一些 Java 对象,用于表示 WebSocket 两节点之间连接的某一端。

Java WebSocket API 将一次会话中的每个具有端点的节点(each peer of a session with an endpoint)模拟成一个 RemoteEndpoint 接口的实例。该接口及其两个子类型(RemoteEndpoint.Whole 和 RemoteEndpoint.Partial)包含了各种各样用于将 WebSocket 消息从端点发送至其节点的方法。

有两种方式可以用以创建端点。第一种是实现 Java WebSocket API 中某些具有必需行为的 API 类,从而能够处理端点生命周期、消费和发送消息、发布自身或连接到节点。

复制代码
session.addMessageHandler(new MessageHandler.Whole
<String>() {
public void onMessage(String text) {
try {
remote.sendText("Got your message (" + text +
"). Thanks !");
} catch (IOException ioe) {
ioe.printStackTrace();
} }

第二种方式是使用 Java WebSocket API 中的某些注解来装饰一个普通 Java 类(POJO)。底层实现将会根据这些被注解的类在运行时创建合适的对象,从而将 POJO 部署为 WebSocket 端点。

复制代码
@ServerEndpoint("/hello")
public class MyHelloServer {
@OnMessage
public String handleMessage(String message) {
return "Got your message (" + message + ").
Thanks !";
} }

API 对每个 Session 的 MessageHandler 注册进行了限制:每个原生 WebSocket 消息(text、binary、pong)类型只能有一个 MessageHandler,该限制有可能在将来会发生变化。

端点在建立 WebSocket 连接的握手开始阶段参与进来,通常都会发送和接收各种各样的 WebSocket 消息。端点的生命周期在 WebSocket 连接关闭时结束。

不论是由于从节点收到 WebSocket 关闭事件,还是因为底层实现需要关闭连接,只要在 WebSocket 端点上的某个打开连接由于任何原因将要被关闭时,WebSocket 实现必须调用 WebSocket 端点的 onClose() 方法。

当然,在 Java EE 7 引入之前也可以使用 Java 来实现 WebSocket 应用,但是这些不同 API 的使用方式之间都有着些许的差异,所以,如果你曾在 Apache Tomcat 7 容器下编写过 WebSocket 应用,那么这些应用都将需要进行修改才能在 Jetty、JBoss 或 Resin 中正常工作。有了可以在 Java EE 中完成以上工作的标准方法是一件非常受欢迎的事。

查看英文原文: Java EE 7 WebSocket Support

2013-07-01 06:5017077
用户头像

发布了 52 篇内容, 共 24.7 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

前端实操案例丨如何实现JS向Vue传值

华为云开发者联盟

Vue 大前端 js Promise Vuex state

DEMO WORLD分论坛聊些啥?高端制造、未来出行、皮肤科技、未来产业……

创业邦

创新

如何成为云原生技术高阶玩家?华为云最近做了这件事

华为云开发者联盟

容器 DevOps 微服务 云原生 华为云

千万级学生管理系统考试试卷存储方案设计

Hesher

架构 Architecture 架构实战营 存储系统

进程内缓存助你提高并发能力!

万俊峰Kevin

缓存 微服务 本地缓存 Go 语言

人人都在谈的图数据库到底是个啥?

华为云开发者联盟

大数据 数据结构 数据 图数据库 华为云图引擎图数据库GES

丰田汽车选用Mobileye和采埃孚的安全技术

E科讯

【LeetCode】找出第 K 大的异或坐标值Java题解

Albert

算法 LeetCode 5月日更

HTTP/3 初体验

运维研习社

nginx 运维 HTTP3.0 5月日更

私有云解决方案

anyRTC开发者

音视频 WebRTC RTC sdk

让人工智能成为保险行业科技基因的一部分!

百度大脑

人工智能 保险

从酷睿双核到Tiger Lake-H,英特尔如何帮游戏笔记本完成蜕变

E科讯

Rust从0到1-错误处理-panic!

rust 错误处理 Error 不可恢复错误

2、kafka 2.8.0 源码环境搭建

杨四正

大数据 kafka 消息队列 kafka2.8

测试开发专题-开篇

禅道项目管理

软件测试 自动化测试 测试开发

多线程 VS 多进程(一)

若尘

多线程 多进程 Python编程 5月日更

看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?

华为云开发者联盟

框架 mindspore 盘古 NLP 大模型 中文预训练模型

NumPy之:ndarray多维数组操作

程序那些事

Python Numpy 程序那些事

论Http、Socket、WebSocket、WebService(SOAP)之间的区别

Damon

5月日更

冈萨雷斯《数字图像处理》学习总结及感悟:第一章 绪论 百闻不如一见

老猿Python

图形图像处理 数字图像处理 冈萨雷斯

飞桨前沿升级、顶级开源项目、产教融合育人,WAVE SUMMIT论坛内容先睹为快!

百度大脑

深度学习 飞桨

java性能分析与问题定位 实战

try catch

Java 性能分析

支付中心设计

try catch

支付 支付中心

JavaScript+TensorFlow.js让你在视频中瞬间消失

不脱发的程序猿

JavaScript 人工智能 开源 TensorFlow.js

智能视频云3.0全景图来了!深度融合视频应用共创行业新生态

百度大脑

云智一体 智能视频 云智技术

深入浅出分布式存储性能优化方案

焱融科技

云计算 分布式 高性能 云存储 超融合

kafka基本概念

杨四正

大数据 kafka 架构设计 消息队列 消息队列架构

详解JQuery框架的五大选择器

华为云开发者联盟

jquery 选择器 层级选择器 属性选择器 过滤选择器

iOS开发底层原理技术~RAC深度解析

ios cocoa 程序员 移动开发

架构实战营模块3课后作业-基于“自研集群+MySQL存储”的消息队列架构设计方案

吴建中

架构实战营

🚄【Redis 干货领域】从底层彻底吃透 AOF 重写 (源码篇)

码界西柚

redis aof Redis 协议 Redis 核心技术与实战 5月日更

浅析Java EE 7的WebSocket 支持_Java_Charles Humble_InfoQ精选文章