异步网络编程框架-Netty概念介绍
?
A helper classwhich initialize a Channel. This class provides the common data structure forits subclasses which actually initialize?Channel’s and their child?Channel’susing the common data structure. Please refer to?ClientBootstrap,?ServerBootstrap,and?ConnectionlessBootstrap for client side, server-side, andconnectionless (e.g. UDP) channel initialization respectively.
Bootstrap:初始化Channel的帮助类,包括初始化连接的基本数据结构,包括ChannelFactory、ChannelPipeline,ChannelPipelineFactory,以及保存Server或者Client端配置的options。其中ServerBootstrap、ConnectionlessBootstrap为Server端创建,ClientBootstrap为Client端创建,顾名思义,ConnectionlessBootstrap为Server端创建的UDP/IP应用。TCP和UDP的区别就不说了,根据自己应用的类别,选择合适的Bootstrap。
这个bootstrap就是个工具类,对于client和server端来说,连接完成后就Ok,至于具体的连接处理,连接关闭等都要靠具体的Channel来处理。Bootstrap的使用就和上节中的例程一样,没有更复杂的操作;准确的应该说和bootstrap这个类没有太大的关系,都是后面提及的channel、pipeline的操作。
ChannelBuffer-类图及官方定义:

Arandom and sequential accessible sequence of zero or more bytes (octets). Thisinterface provides an abstract view for one or more primitive byte arrays(byte[]) and NIO Buffers.
ChanelBuffer是Netty中的核心类,但是按照文档说明,ChannelBuffer就是把byteArrays和NIO byteBuffer包装一下,更方便的操作byte,毕竟在Channel中传输的是byte。
ChannelBuffer操作和NIO里面的ByteBuffer操作有些不一致的地方,更准确的说,ChannelBuffer定义了一套Buffer的操作,并且在应用中严格遵守规则来操作Buffer。下面我们看下Buffer的操作:
?
- Buffer创建:建议使用ChannelBuffers来初始化,对于具体Buffer的构造函数不建议使用。如果没有指定创建Buffer的形式,默认创建HeapChannelBuffer,否则按照你指定的方式创建。支持随机索引读取。Buffer操作:ChannelBuffer实际上是按照readerIndex和writerIndex来将Buffer区分成DescardableBytes、ReadableByte、WritableByte,所有的读写取操作同时更新的是readerIndex和writerIndex。这些个关系可以仔细看下文档,熟悉了这些操作,感觉比NIO的buffer操作起来要方便。注意Buffer的clear、reset操作,clear操作并不会清空Buffer数据,只是重置readerIndex和writerIndex;reset操作也是同样,只是重置,不对buffer里面的数据操作。所以对于Buffer的访问,只能通过readerIndex和writerIndex来访问,所以,尽量用逻辑意义去访问Buffer,clear之后,就不要再读取Buffer里面的数据了,尽管数据存在,但是从逻辑意义上,你已经删除这些数据了(物理数据依然存在)。上一章节中提到了ChannelBuffer的Zero-Copy操作,这个为什么能够提高性能,怎么实现?duplicate和slice操作会返回独立的readerIndex和writerIndex,Buffer里面的数据么有改变;该Buffer和原Buffer共用一块数据,但是可以独立操作,如果你没有修改buffer数据的意向,只是查找或者进行逻辑判断,这个duplicate和slice操作正和你意。这个能从很大意义上减小内存拷贝操作,如果你确实想复制一份buffers数据,请用copy函数,这个操作会返回一个原Buffer的拷贝。所用使用slice、duplicate、copy函数之前,请确认自己的操作意向,尽可能利用buffer特性,提高性能。Buffer里面有这么两个参数markedReaderIndex、markedWriterIndex,各位看官可以看下这两个参数有什么用?再提醒下,Buffer的toString方法和Java本身的toString方法不一致。
?
channelBuffer的具体实现类图
?

ChannelBuffer有这么多种实现,他们之间有什么区别呢?其实在上面已经有提及,如果想具体了解下,可以看下这些Buffer的duplicate、slice、copy操作。这个上面有个ByteBufferBackedChannelBuffer,这个Buffer和NIO的Buffer最为相似,不过也遵循readerIndex和writerIndex的限制。
?