本章将讲述WebSocket端点的生命周期。WebSocket端点的生命周期为开发人员提供了一个框架来管理端点所需要的资源,也提供了一个框架来拦截消息。我们将仔细探讨其生命周期的顺序和语义,以及Java WebSocket API如何提供API和注解来支持处理这些事件。
一、WebSocket协议
与基于HTTP的技术不同,WebSocket具有生命周期。此生命周期周期由WebSocket协议支撑。WebSocket协议定义了客户端和服务器长时间存活的专用的TCP连接,一旦连接已经建立,数据的传输就可以往返传输。WebSocket协议中包含两种主要类型的帧:控制帧和数据帧。控制帧是用于执行协议的一些内部逻辑的数据传输。例如关闭帧(意味着发送者准备关闭连接)、Ping帧(检查WebSocket对等节点的连接的健康性)。Pong帧(对Ping帧做出回应)。数据帧定义了携带应用数据的WebSocket传输的种类。数据帧分为两类:文本型和二进制型(例如,图像数据)。
二、WebSocket生命周期
所有Java WebSocket端点生命周期的第一个事件是打开通知,它用来指示到WebSocket会话另一端的连接已经建立。一旦打开通知被WebSocket对话的两端都接收到,参与的任意WebSocket后续就可以发送消息了。在WebSocket对话期间,可能会出现一些消息传递的错误。接受消息的WebSocket端点本身就可能产生错误,或者WebSocket实现本身在某些情况下也会产生错误。要注意对错误的处理。不管在WebSocket对话的哪一端准备结束对话,他都可以初始化关闭事件。下面从Java组件的视角来看看其生命周期如何呈现。
打开事件:@OnOpen 此事件发生在端点上建立新连接时并且在任何其他事件发生之前
消息事件:@OnMessage 此事件接收WebSocket对话中另一端发送的消息。
错误事件:@OnError 此事件在WebSocket连接或者端点发生错误时产生
关闭事件:@OnClose 此事件表示WebSocket端点的连接目前部分地关闭,它可以由参与连接的任意一个端点发出
你可能已经注意到,我用注解式来说明端点事件处理,这正是WebSocket所推荐的。虽然,你也可以用继承式来编程这些事件
@OnOpen 指示当此端点建立新的连接时调用此方法。此事件伴随着三部分信息:WebSocket Session对象,用于表示已经建立好的连接;配置对象(EndpointConfig的实例),包含了用来配置端点的信息;一组路径参数,用于打开阶段握手时WebSocket端点入站匹配URI。@OnOpen注解的方法是没有任何返回值的公有方法,这些方法有一个可选的Session参数、一个可选的EndpointConfig参数,以及任意数量的被@PathParam注解的String参数。
@OnMessage 处理入站的消息。
@OnError 可以处理WebSocket实现处理入站消息时发生的任何异常。处理入站消息时,可能会发生3中基本的错误类型。首先,WebSocket实现产生的错误可能会发生,这些异常属于SessionException类型,其次,错误可能会发生在当WebSocket实现试图将入站消息解码成开发人员所需要的对象时。此类错误都是DecodeException类型。最后是由WebSocket端点的其他方法产生的运行时错误。WebSocket实现将记录WebSocket端点操作过程中产生的任何异常。
@OnClose 它对于在WebSocket连接关闭时做其他的通用清理工作。@OnClose 可以用来注解多种不同类型的方法来关闭事件。