background image

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 有这个事件的响应方法的话那么就会

调用到这个方法。在此之后就是数据的传输了。下面是一个简单客户端的代码解读。

?