浅析Java EE 7的WebSocket 支持

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

你可能感兴趣的:(浅析Java EE 7的WebSocket 支持)