netty代码分析之一::ChannelBuffer

netty的使用手册, 见附件下载。看过用户手册,对netty有了整体的大致了解后,可以深入分析其源码了。

netty 截止2012年4月20号github上最新更新的代码包结构如下:

netty代码分析之一::ChannelBuffer_第1张图片netty代码分析之一::ChannelBuffer_第2张图片

 

 除去example 包,剩余的主要由buffer,channel,handler 三大块组成。

       这里介绍顺序遵循《java NIO》一书,同样,先从buffer 包开始介绍,一起开始吧~

下图为主要的buffer 类图:

netty代码分析之一::ChannelBuffer_第3张图片

 

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的设计思想及对各种不同网络应用的场景下,如何设计能达到比较好的效果。

你可能感兴趣的:(channel)