netty in action fifth chapter Summary

来源:互联网 发布:好用的日记本软件 编辑:程序博客网 时间:2024/05/16 16:13

这章介绍ByteBuf的使用

ByteBuf是ByteBuffer的改进版,添加了蛮多功能。

netty的Buf类使用引用计数,确定释放内存;使用池,使得内存处于安全级别。

ByteBuf 网络通信都是byte传输。它是最基础的buf类。
含有两个索引:readerIndex,writerIndex。
每当写入数据,writerIndex增加,每当读取数据,则readerIndex增大。不过readerIndex最大值就是writerIndex的值

heap Buffers 使用堆,使用数组。可方便申请和释放

direct Buffers 不使用堆,直接申请内存。当使用于socket通信时,是最佳的。原因是堆内存会先copy到直接内存,再传输。它不能用数组形式访问。假如你需要数组的操作,应该使用heap Buffers

composite buffer 复合缓冲 可将不同类型的ByteBuf对象组合在一起。有点像链表。使用hasArray,会返回false

ByteBuf能够任意访问,通过索引下标
是有序的,通过readerIndex和writerIndex访问

discardReadBytes()使得readerIndex变成0。作用是把已经读了的数据丢弃掉,让两个索引减少,使得writable bytes空间增大。

Readable bytes buffer.readByte获取所有的数组

调用clear()方法,将两个索引都置为0

查找方法 indexOf()
有一个ByteBufProcessor接口,用于复杂的查找行为

提供了mark和reset方法。mark记录读或写的位置,reset可重置到mark的位置。

derived buffers 派生buffer,调用duplicate,slice(),readOnly(),order(),它有独立的读写索引和mark索引。其他的共享原来的数据。
需要一份拷贝的数据,就要用copy()

get和set开头的方法,都不会移动读写索引,
read和write开头的方法,会移动读写索引

ByteBufHolder 辅助类,当要一个消息体有效负载于一个ByteBuf,使用它比较好。提供了data(),copy()方法等。
这个没看懂。实际应用时再了解吧。

为更方便使用,推出了util类

ByteBufAllocator 帮助获得ByteBuf的实例。提供了获取多种ByteBuf类型的方法。
获取ByteBufAllocator,使用Channel的alloc()方法获取。
它有两种实现,一种是使用池分配和释放,一种是每次新建ByteBuf。默认是PoolByteBufAllocator

Unpooled也是缓冲区实现类,查看文档吧

ByteBufUtil 提供了众多静态方法。不管对象是使用pool还是不用。
其中hexdump()比较有用,能够以16进制打印字节数据。也提供了判相等函数。

发现一个中文版翻译。
http://blog.csdn.net/abc_key/article/details/37877225
不过我打算继续看英文版的。原因是某些关键部分更好理解。看不懂的地方就对照着中文版看。

0 0