快手、孩子王、华为等专家分享大模型在电商运营、母婴消费、翻译等行业场景的实际应用 了解详情
写点什么

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

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

关注

评论

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

架构师训练营第 1 期 -- 第九周学习总结

发酵的死神

极客大学架构师训练营

性能优化-数据库,JVM, 秒杀场景

garlic

极客大学架构师训练营

第五周作业

hunk

极客大学架构师训练营

成为架构师 - 架构师训练营第 05 周

陈永龙Vincent

第五周作业总结

hunk

极客大学架构师训练营

第 9 周 997日记

Pyr0man1ac

架构师训练营第九周学习总结

Gosling

极客大学架构师训练营

第九周作业 (作业一)

Geek_83908e

架构师一期

第 8 周 996日记

Pyr0man1ac

架构师训练营第 2 期 第五周作业

月下独酌

极客大学架构师训练营

架构师训练营 - 第九周

袭望

架构师训练营第一期-第九周学习总结

卖猪肉的大叔

架构第九周总结

Geek_Gu

极客大学架构师训练营

一致性Hash算法

jorden wang

GO训练营第1周总结

Glowry

架构师训练营第一期-第九周课后作业

卖猪肉的大叔

极客大学架构师训练营

架构第九周作业

Geek_Gu

极客大学架构师训练营

Week5 一致性Hash

evildracula

学习 架构

架构师训练营第九周命题作业

一马行千里

学习 极客大学架构师训练营

第 9 周 作业

Pyr0man1ac

架构师训练营第五周作业

邢永春

架构师训练营第九周总结

吴传禹

极客大学架构师训练营

架构师训练营 - 第 9周课后作业 - JVM 垃圾回收原理

树森

架构师训练营第五周学习总结

邢永春

第五周-作业1

Mr_No爱学习

第 8 周 作业

Pyr0man1ac

Architecture Phase1 Week9:Summarize

phylony-lu

极客大学架构师训练营

架构师训练营第二期 第5周总结

月下独酌

极客大学架构师训练营

关于一致性Hash算法的测试

皮蛋

架构师训练营 - week09 - 作业

lucian

极客大学架构师训练营

架构师训练营 - week09 - 学习总结

lucian

极客大学架构师训练营

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