Java WebSocket生命周期

本章将讲述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所推荐的。虽然,你也可以用继承式来编程这些事件

  1. @OnOpen 指示当此端点建立新的连接时调用此方法。此事件伴随着三部分信息:WebSocket Session对象,用于表示已经建立好的连接;配置对象(EndpointConfig的实例),包含了用来配置端点的信息;一组路径参数,用于打开阶段握手时WebSocket端点入站匹配URI。@OnOpen注解的方法是没有任何返回值的公有方法,这些方法有一个可选的Session参数、一个可选的EndpointConfig参数,以及任意数量的被@PathParam注解的String参数。
  2. @OnMessage 处理入站的消息。连接上的消息将以3种基本形式抵达:文本消息、二进制消息或者Pong消息。最基本的形式是选择使用带String参数的方法来处理文本消息;使用ByteBuffer或者是byte[]参数的方法来处理二进制文本;若你的消息仅仅是处理Pong消息,则可以使用Java WebSocket API中的PongMessage接口的一个实例。当然可以使用一个boolean型参数表示对到来的消息进行分片。当boolean型参数值为false时,表示后续还有整个文本消息序列中的更多消息分片的到来,当设置为true时,表示当前消息是消息分片中最后一个分片。消息的处理还有很多选项,比如使用JavaI/O,甚至可以让WebSocket实现把入站消息转换成自己选择的对象。这个将在消息通信基础中提到,WebSocket应用一般是异步的双向消息。因此通过@OnMessage注解的此类方法上有一个额外选项:方法可以有返回值或者返回为空。当使用@OnMessage注解的方法有返回类型时,WebSocket实现立即将返回值作为消息返回给刚刚在方法中处理的消息的发送者。
  3. @OnError 可以处理WebSocket实现处理入站消息时发生的任何异常。处理入站消息时,可能会发生3中基本的错误类型。首先,WebSocket实现产生的错误可能会发生,这些异常属于SessionException类型,其次,错误可能会发生在当WebSocket实现试图将入站消息解码成开发人员所需要的对象时。此类错误都是DecodeException类型。最后是由WebSocket端点的其他方法产生的运行时错误。WebSocket实现将记录WebSocket端点操作过程中产生的任何异常。
  4. @OnClose 它对于在WebSocket连接关闭时做其他的通用清理工作。@OnClose 可以用来注解多种不同类型的方法来关闭事件。

下面将用一个红绿灯演示了WebSocket的生命周期,示例连接:Lifecycle示例(一)Lifecycle示例(二)

时间: 2024-08-08 05:19:00

Java WebSocket生命周期的相关文章

java类生命周期详细解析

(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)

hibernate session缓存和java对象生命周期

一.java对象生命周期 1.在java中,使用new关键字,创建一个java对象,jvm就为这个对象分配一块内存空间.只要这个变量被引用,他就一直存在于内存中.如果没有被任何变量引用(包括间接引用),那么这个对象就会被垃圾回收器回收.下面用一段代码来解释: Customer c=new Customer(); Order o1=new Order(); Order 02=new Order(); o1.setCustomer(c); c.getOrders().add(o1); o1=null

Java学习之==>Java线程生命周期与状态切换

一.Java线程生命周期与状态切换 这些状态的描述可以总结成下图: NEW 一个刚创建但尚未启动的Java线程实例就是处于 NEW 状态 public class App { public static void main(String[] args) { Thread thread = new Thread(); Thread.State state = thread.getState(); System.out.println(state); } } // 输出结果 NEW RUNNABLE

Java实现生命周期管理机制

先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然只写以下几行代码,于是我感觉瞬间受到了很多伤害. public static void main(String[] args) { System.out.println(new Date() + ",server shutdown!"); } 这个中间件启动和运行的时候,开启了监听,启动着

java对象生命周期

java中一个对象的完整生命周期涉及java平台的很多技术.在创建一个java对象之前,需要先由虚拟机加载该类,然后对该java类进行链接和初始化.初始化完成之后,才创建出该类的对象实例.java对象也有自己的初始化过程,主要通过构造方法完成.当不再有引用指向该对象时,对象占用的内存会在合适的时机被垃圾回收器回收.对象终止机制提供了一种方式在对象被回收之前进行清理工作. java类的链接 虚拟机刚启动时,内部只包含java核心类的相关信息.随着程序的运行,不断有新的java类被加载到虚拟机中.j

Java 线程生命周期

2.线程的生命周期 与人有生老病死一样,线程也同样要经历开始(等待).运行.挂起和停止四种不同的状态.这四种状态都可以通过Thread类中的方法进行控制.下面给出了Thread类中和这四种状态相关的方法. // 开始线程 publicvoid start( ); publicvoid run( ); // 挂起和唤醒线程 publicvoid resume( );     // 不建议使用 publicvoid suspend( );    // 不建议使用 publicstaticvoid s

Java多线程生命周期

这两天在看线程的东西,根据牛人的博客总结了一些:每个Java程序至少包含一个线程:主线程.其它线程都是通过Thread构造器或实例化继承类Thread的类来创建的.正在运行的线程通常是由操作系统创建的:Thread对象是由JavaVM创建的,在一个线程对新线程的Thread对象调用start()方法之前,这个新线程并没有真正开始执行.Thread对象在其线程真正启动之前就已经存在了,而且其线程退出之后仍然存在.另外需要说明的是:run()方法只是一个类中的普通方法,直接执行和普通的方法没有两样:

java static 生命周期和作用域

类的成员变量有两种:一种是被static关键字修饰的变量,叫类变量或静态变量,一种是没有被static修饰的,叫做实例变量 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加. 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量. 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象 静态变量就会被分配空间,静态变量就可以被使用了.总之,实例变量必须创建对

Oracle 宣布 Java 7 生命周期终结

快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/ 百度网盘同步:http://pan.baidu.com/s/1jG1Q58M 分享  [中文纪录片]互联网时代   http://pan.baidu.com/s/1qWkJfcS 官方QQ群:(申请加入,说是我推荐的) App实践出真知 4