设为首页 加入收藏

TOP

2.4.2 AIO创建的TimeClient源码分析(2)
2014-07-09 13:01:18 来源: 作者: 【 】 浏览:137
Tags:2.4.2 AIO 创建 TimeClient 源码 分析

2.4.2  AIO创建的TimeClient源码分析(2)

由于在AsyncTimeClientHandler中大量使用了内部匿名类,所以代码看起来稍微有些复杂,下面我们就对主要代码进行详细讲解。

24~32行是构造方法,首先通过AsynchronousSocketChannel的open方法创建一个新的AsynchronousSocketChannel对象。然后跳到第36行,创建CountDownLatch进行等待,防止异步操作没有执行完成线程就退出。第37行通过connect方法发起异步操作,它有两个参数,分别如下。

A attachment:AsynchronousSocketChannel的附件,用于回调通知时作为入参被传递,调用者可以自定义;

CompletionHandler<Void, super A> handler:异步操作回调通知接口,由调用者实现。

在本例程中,我们的两个参数都使用AsyncTimeClientHandler类本身,因为它实现了CompletionHandler接口。

接下来我们看异步连接成功之后的方法回调——completed方法。代码第52行,我们创建请求消息体,对其进行编码,然后复制到发送缓冲区writeBuffer中,调用Asynchronous SocketChannel的write方法进行异步写。与服务端类似,我们可以实现CompletionHandler <Integer, ByteBuffer>接口用于写操作完成后的回调。代码第60~62行,如果发送缓冲区中仍有尚未发送的字节,将继续异步发送,如果已经发送完成,则执行异步读取操作。

代码第64~97行是客户端异步读取时间服务器服务端应答消息的处理逻辑。代码第64行调用AsynchronousSocketChannel的read方法异步读取服务端的响应消息。由于read操作是异步的,所以我们通过内部匿名类实现CompletionHandler<Integer, ByteBuffer>接口,当读取完成被JDK回调时,构造应答消息。第71~78行从CompletionHandler的ByteBuffer中读取应答消息,然后打印结果。

第102~111行,当读取发生异常时,关闭链路,同时调用CountDownLatch的countDown方法让AsyncTimeClientHandler线程执行完毕,客户端退出执行。

需要指出的是,正如之前的NIO例程,我们并没有完整的处理网络的半包读写,在对例程进行功能测试的时候没有问题,但是,如果对代码稍加改造,进行压力或者性能测试,就会发现输出结果存在问题。

由于半包读写会作为专门的小节在Netty的应用和源码分析章节进行详细讲解,在NIO的入门章节我们就不详细展开介绍了,以便读者能够将注意力集中在NIO的入门知识上来。

在下面的小节中我们会运行AIO版本的时间服务器程序,并通过打印线程堆栈的方式看下JDK回调异步Channel CompletionHandler的调用情况。
 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.4.2 AIO创建的TimeClient源码分.. 下一篇2.4.3 AIO版本时间服务器运行结果

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)