写点什么

浅析 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:5017102
用户头像

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

关注

评论

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

11张图深入理解分布式锁原理

慕枫技术笔记

微服务 后端 1月月更

Microchip宣布标准非混合型宇航级电源转换器系列 已新增28伏输入耐辐射选项

极客天地

【架构师训练营】模块六作业

樰巳-堕~Horry

架构实战营 「架构实战营」

实时渲染大赛太卷了!来看大佬提前交卷的优秀参赛作品

3DCAT实时渲染

3D 实时渲染

AI+遥感:释放每个像元价值

百度大脑

人工智能 AI

基于OpenMLDB v0.4.0快速搭建全流程线上AI应用

第四范式开发者社区

人工智能 机器学习 OpenMLDB 特征平台

Microchip发布具有强大编程和调试功能的新型在线仿真器(ICE)

极客天地

openLooKeng算子接口和执行流程

LooK

记线上服务 cpu 爆表 问题解决

常清静

性能优化 压测分析 CPU问题

🏆【Alibaba微服务技术系列】「Dubbo3.0技术专题」(1)Dubbo3新特性概览的介绍说明

码界西柚

dubbo Dubbo3 Alibaba技术 1月日更 Apache alibaba

MyBatis3源码解析(1)探索准备

Java mybatis

一文聊透Netty核心引擎Reactor的运转架构

bin的技术小屋

网络编程 nio 中间件 jdk8 netty

云智慧智能研究院:2022年智能运维发展八大趋势

云智慧AIOps社区

趋势 AIOPS 智能运维 云智慧 运维发展

你必须知道的Java17新特性-密封类(Sealed Classes)

蜜糖的代码注释

Java 开发 后端开发

Python Qt GUI设计:做一款串口调试助手(实战篇—1)

不脱发的程序猿

PyQt Python Qt Python Qt GUI设计 串口调试助手

如何优雅地解决平台字体适应问题

编程三昧

CSS 前端开发 HTML5, CSS3 1月月更

ABAP 和 Java 里的单例模式攻击

汪子熙

Java abap 1月月更

开源机器学习数据库OpenMLDB v0.4.0产品介绍

第四范式开发者社区

人工智能 机器学习 大数据 OpenMLDB

区块链赋能民生“第一单”:200多套房源试水,“链宜租”租房系统上线

CECBC

模块 6 作业

miliving

openLooKeng | Oracle update和delete支持简介及实现

LooK

对GO切片的理解

CRMEB

左手2021, 右手2022 | 社区征文

soolaugust

技术 云原生 新春征文

虎虎生威新春大吉,2月更文挑战来袭!

InfoQ写作社区官方

2月月更 热门活动

Spark合并Iceberg小文件内存溢出问题定位和解决方案

漫长的白日梦

spark iceberg 小文件

Go 语言快速入门指南:Go 函数

宇宙之一粟

函数 Go 语言 1月月更

记 服务 内存飙升压测 - 分析总结

常清静

压测分析 内存问题 排查工具

ReactNative进阶(三十七):应用 SectionList 实现分组列表

No Silver Bullet

1月月更 ReactNative sectionList

openLooKeng1.5.0新版本正式上线

LooK

模块六

撿破爛ぃ

架构训练营

openLooKeng基于选择率的动态过滤优化

LooK

大数据

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