数据传输载体 --ByteBuf

Netty 中数据是以ByteBuf为单位进行交互的。指针

那么分析一下ByteBuf结构code

ByteBuf结构blog

1 ByteBuf是一个字节容器,结构分为三个部分,第一部分是已丢弃字节,这部分数据是无效的,第二部分是可读字节,这部分数据是ByteBuf的主体数据,从 ByteBuf 里面读取的数据都来自这一部分;最后一部分的数据是可写字节,全部写到 ByteBuf 的数据都会写到这一段。最后一部分虚线表示的是该 ByteBuf 最多还能扩容多少容量
2 上面3段内容有两个指针划分出来的,从左到右,依次是读指针(readerIndex)、写指针(writerIndex),其中变量capacity是ByteBuf的总容量。
3 从 ByteBuf 中每读取一个字节,readerIndex 自增1,ByteBuf 里面总共有 writerIndex-readerIndex 个字节可读, 由此能够推论出当 readerIndex 与 writerIndex 相等的时候,ByteBuf 不可读
4 写数据是从 writerIndex 指向的部分开始写,每写一个字节,writerIndex 自增1,直到增到 capacity,这个时候,表示 ByteBuf 已经不可写了
5 ByteBuf 里面其实还有一个参数 maxCapacity,当向 ByteBuf 写数据的时候,若是容量不足,那么这个时候能够进行扩容,直到 capacity 扩容到 maxCapacity,超过 maxCapacity 就会报错内存

容量APIci

capacity()

表示ByteBuf的总容量。即 ByteBuf 底层占用了多少字节的内存(包括丢弃的字节、可读字节、可写字节),不一样的底层实现机制有不一样的计算方式。it

readableBytes() 与 isReadable()

readableBytes() 表示 ByteBuf 当前可读的字节数,它的值等于 writerIndex-readerIndex,若是二者相等,则不可读,isReadable() 方法返回 falsetable

writableBytes()、 isWritable() 与 maxWritableBytes()

其中writableBytes()表示ByteBuf可写的字节,它等于capacity-writerIndex,若是二者相等则表示不能向其中写数据了,isWritable()返回false。则不能向其中添加数据了,
可是Netty有自动扩容机制,直到扩容到底层的内存大小为 maxCapacity,而 maxWritableBytes() 就表示可写的最大字节数,它的值等于 maxCapacity-writerIndex容器

读写指针相关的 API变量

readerIndex() 与 readerIndex(int)

前者表示返回当前的读指针 readerIndex, 后者表示设置读指针方法

writeIndex() 与 writeIndex(int)

前者表示返回当前的写指针 writerIndex, 后者表示设置写指针

markReaderIndex() 与 resetReaderIndex()

前者表示把当前的读指针保存起来,后者表示把当前的读指针恢复到以前保存的值,下面两段代码是等价的

// 代码片断1
int readerIndex = buffer.readerIndex();
// .. 其余操做
buffer.readerIndex(readerIndex);


// 代码片断二
buffer.markReaderIndex();
// .. 其余操做
buffer.resetReaderIndex();

但愿你们多多使用代码片断二这种方式,不须要本身定义变量,不管 buffer 看成参数传递到哪里,调用 resetReaderIndex() 均可以恢复到以前的状态,在解析自定义协议的数据包的时候很是常见,推荐你们使用这一对 API

相关文章
相关标签/搜索