免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

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

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

关注

评论

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

【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA

华为云数据库小助手

GaussDB 交流 华为云数据库 人物访谈

redis--zset解析

en

redis Zset 引航计划

Python——函数正确调用

在即

9月日更

模块七作业

seawolflin

架构实战营

redis主从实践(一)

风翱

redis 9月日更

数据结构和算法应用

Albert

算法 9月日更

Parted 创建 GPT 分区

耳东@Erdong

Linux 9月日更 parted 磁盘分区

Context 和 struct

Rayjun

struct Context Go 语言

Python代码阅读(第27篇):将变量名转换成驼峰形式

Felix

Python 编程 Code Programing 阅读代码

深入理解rtmp(三)之手把手实现握手协议

轻口味

音视频 RTMP 9月日更

灯塔之上:vivo X70背后的影像进化史

脑极体

【网络安全】Spring框架漏洞总结(二)

网络安全学海

黑客 网络安全 信息安全 WEB安全 漏洞挖掘

【Flutter 专题】49 图解 Flutter 与 Android 原生交互

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

全方位解读服务网格(Service Mesh)的背景和概念

xcbeyond

Service Mesh 服务网格 引航计划

翻转未来!钢铁之城重添色彩

白洞计划

常用特殊符号大全

入门小站

工具

分享 4 个前端开发必备的 Chrome 扩展

devpoint

SVG chrome扩展 9月日更

手撸二叉树之二叉搜索树中的众数

HelloWorld杰少

9月日更

这可能是最细的HashMap详解了!

程序员阿杜

Java JVM ArrayList

通过编程训练题来讲讲链表操作

Regan Yue

算法 链表 9月日更

【VueRouter 源码学习】第九篇 - router-view 组件的实现

Brave

源码 vue-router 9月日更

linux之chsh命令

入门小站

Linux

为何数据类大项目都会先做盘点??

奔向架构师

数据仓库 数据治理 9月日更

Golang 中的好代码 VS 烂代码

baiyutang

编码 Go 语言 9月日更

阿里巴巴开源数据库--OceanBase从使用聊到架构剖析

hanaper

5 个网站将您的前端技能从 1 倍提升到 100 倍

云原生

学习 大前端 全栈

这可能是最细的ArrayList详解了!

程序员阿杜

Java ArrayList

详解css中清除浮动的四种方式,float浮动怎么用更为合理

你好bk

最佳实践 方法论 大前端 html/css 语言 & 开发

将JSON中对于集合的数据,如何解析成对象集合

卢卡多多

集合 Stream<T> 9月日更

HTML进阶(三)

Augus

html 9月日更

网络攻防学习笔记 Day133

穿过生命散发芬芳

网络基础 9月日更

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