HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

1.8图数据库是什么?我为什么要关注它?

Geek_古藤模根

图数据库 Gremlin

1.5 本书源代码、样例程序和数据介绍

Geek_古藤模根

1.6 TinkerPop 3.4简述

Geek_古藤模根

图数据库 Gremlin

Linux驱动开发-编写按键驱动

DS小龙哥

4月月更 Linux驱动

如何撰写出有效的帮助文档内容?

小炮

帮助文档

GPU底层技术、全球市场格局分析

Finovy Cloud

人工智能 云计算 云服务器 GPU服务器 GPU算力

Spring Boot 核心的 25 个注解

爱好编程进阶

Java 面试 后端开发

低代码实现探索(四十)前端全局配置

零道云-混合式低代码平台

如何5分钟做出高明的架构决策

凌晞

架构 架构模式

源码级别的广播与监听实现

阿Q说代码

spring源码 实战 监听 4月月更 广播

助力 60+ 市区管理建设,TDengine 联手数字政通打造智慧城市平台

TDengine

数据库 tdengine 时序数据库

MySQL慢查询,一口从天而降的锅!

爱好编程进阶

Java 面试 后端开发

1.9 术语简介

Geek_古藤模根

图数据库 Gremlin

大数据培训经典SQL面试题解析

@零度

sql 大数据开发

Spring Boot 中三种跨域场景总结,这篇必看!不看后悔系列

爱好编程进阶

Java 面试 后端开发

模块三:作业

本人法海

「架构实战营」

Android C++系列:C++最佳实践3继承与访问控制

轻口味

c++ android ndk 4月月更

Pipy 性能基准测试的思考与实践

Flomesh

代理 benchmark Pipy

大咖实战|Kubernetes自动伸缩实现指南分享

云智慧AIOps社区

Docker 云计算 Kubernetes 容器 云原生

深入解析JVM-类加载机制

janyxe

Java JVM 类加载器 双亲委派 类加载机制

自己动手写Docker系列 -- 6.1 ip分配管理

Go Docker 4月月更

[Day15]-[动态规划]鸡蛋掉落

方勇(gopher)

LeetCode 动态规划 数据结构与算法、

java培训:java流中的异常处理方法分享

@零度

JAVA开发 java流

Spring Cloud Gateway实战之二:更多路由配置方式

爱好编程进阶

Java 面试 后端开发

实用小精灵--阿帕奇TinkerPop向导 (第283版)

Geek_古藤模根

图数据库 Gremlin apache 社区

web前端培训如何使用CSS连接数据库

@零度

CSS 前端开发

【直播回顾】OpenHarmony 3.1 Release版本南北向关键能力解读

OpenHarmony开发者

OpenHarmony 直播回放

TiUP:TiDBAer 必备利器

PingCAP

TiDB

最受欢迎的5种编程语言各有什么特点或优点?

源字节1号

软件开发 后端开发 编程语言、

Kubernetes中,微服务自动化发布系统详解

爱好编程进阶

Java 面试 后端开发

读《Software Engineering at Google》(05)

术子米德

架构师成长笔记

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