netty的使用手册, 见附件下载。看过用户手册,对netty有了整体的大致了解后,可以深入分析其源码了。
netty 截止2012年4月20号github上最新更新的代码包结构如下:
除去example 包,剩余的主要由buffer,channel,handler 三大块组成。
这里介绍顺序遵循《java NIO》一书,同样,先从buffer 包开始介绍,一起开始吧~
下图为主要的buffer 类图:
channelBuffer 下有一个接口及一个抽象类,接口中只有一个unwrap()方法,抽象类的多个实现类分别代表了不同特性的buffer,但都大同小异。
channelBuffer 读写主要包含两类方法:
第一类: getXX(index), setXXX(index),不改变readIndex, writeIndex 。
第二类: readXXX(), writeXXX(), 会改变readIndex,writeIndex。
另外还有duplicate(),slice() 用于对共享的byte[] 引入另外的buffer视图,对该视图的操作会影响原byte[]。
创建channelBuffer时,不建议自己创建具体实现类,推荐使用channelBuffers 工具类创建。
WrapperedChannelBuffer 辅助类用于将当前byte[]加入额外的包装属性,如readOnly等等。
channelBuffer 类避免了原NIO中byteBuffer类读切换写时的flip(),rewind()的操作,更加简单易用。
ChannelBuffers 类有三种主要的用途:
第一种:用于创建合适的channelBuffer类,分配大小,内存字节顺序,合并多个buffer,buffer(), dynamicBuffer(),,compositeBuffer()
第二种:包装buffer使之有特殊的属性: wrappedBuffer()
第三种: 深度拷贝,合并现有buffer,copiedBuffer() ,与duplicate()不同,那里只是拷贝视图,内部共享同一个byte[]。
最常用的是HeapChannelBuffer中的BigEndianHeapChannelBuffer。
ChannelBufferIndexFinder 定义了多个常量,用于查找buffer中特定的字符或索引。
DirectBuffer 用于在java堆外内存中创建buffer, 采用0拷贝方法,能合理加快频繁网络IO的速度。
HeapChannelBufferFactory 与 DirectChannelBufferFactory 两个工厂类通过ChannelBuffers创建BigEndianHeapChannelBuffer和LittleEndianHeapChannelBuffer。
channelBuffer不是线程安全的。
只要细读过o'rally的《java nio》,netty 的buffer包还是比较容易理解的。本章也比较简单,以后会陆续介绍channel包及handle包,netty的设计思想及对各种不同网络应用的场景下,如何设计能达到比较好的效果。