JAVA 中 Netty 代码的分析
Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的
网络服务器和客户端程序
[官方定义],整体来看其包含了以下内容:1.提供了丰富的协议编
解码支持,
2.实现自有的 buffer 系统,减少复制所带来的消耗,3.整套 channel 的实现,4.
基于事件的过程流转以及完整的网络事件响应与扩展,
5.丰富的 example。本文并不对 Netty
实际使用中可能出现的问题做分析,只是从代码角度分析它的架构以及实现上的一些关键
细节。
首先来看下最如何使用
Netty(其自带 example 很好展示了使用),Netty 普通使用一般是通过
BootStrap 来启动,BootStrap 主要分为两类:1.面向连接(TCP)的 BootStrap(ClientBootStrap
和
ServerBootstrap),2.非面向连接(UDP) 的(ConnectionlessBootstrap)。
Netty 整体架构很清晰的分成 2 个部分,ChannelFactory 和 ChannelPipelineFactory,前者主要
生产网络通信相关的
Channel 实例和 ChannelSink 实例,Netty 提供的 ChannelFactory 实现
基本能够满足绝大部分用户的需求,当然你也可以定制自己的
ChannelFactory,后者主要关
注于具体传输数据的处理,同时也包括其他方面的内容,比如异常处理等等,只要是你希
望的,你都可以往里添加相应的
handler,一般 ChannelPipelineFactory 由用户自己实现,因为
传输数据的处理及其他操作和业务关联比较紧密,需要自定义处理的
handler。
现在,使用
Netty 的步骤实际上已经非常明确了,比如面向连接的 Netty 服务端客户端使用,
第一步:实例化一个
BootStrap,并且通过构造方法指定一个 ChannelFactory 实现,第二步:
向
bootstrap 实例注册一个自己实现的 ChannelPipelineFactory,第三步:如果是服务器端,
bootstrap.bind(new InetSocketAddress(port)),然后等待客户端来连接,如果是客户端,
bootstrap.connect(new InetSocketAddress(host,port))取得一个 future,这个时候 Netty 会去连接
远程主机,在连接完成后,会发起类型为
CONNECTED 的 ChannelStateEvent,并且开始在
你自定义的
Pipeline 里面流转,如果你注册的 handler 有这个事件的响应方法的话那么就会
调用到这个方法。在此之后就是数据的传输了。下面是一个简单客户端的代码解读。
?