首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

netty代码分析之一:ChannelBuffer

2012-07-16 
netty代码分析之一::ChannelBuffernetty的使用手册, 见附件下载。看过用户手册,对netty有了整体的大致了解

netty代码分析之一::ChannelBuffer

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

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

netty代码分析之一:ChannelBuffernetty代码分析之一:ChannelBuffer

?

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

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

下图为主要的buffer 类图:

netty代码分析之一:ChannelBuffer

?

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

热点排行