![](https://img.haomeiwen.com/i9118347/4dd89be528952945.jpg)
介绍:
网络数据的基本单位是字节,ByteBuf是Netty的数据容器;Java NIO提供了ByteBuffer作为字节容器,Netty 的 ByteBuffer 替代品是 ByteBuf。解决了 JDK API 的局限性,又为网络应用程序的开发者提供了更好的 API。
优点:
- 通过内置的复合缓冲区类型实现了透明的零拷贝。
- 容量可以按需增长。
- 在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip()方法。
- 读和写使用了不同的索引。
- 支持引用计数。
- 支持池化。
所有的网络通信都会涉及到字节序列的移动。
结构:
![](https://img.haomeiwen.com/i9118347/f7e7fe5ec698ba67.png)
ByteBuf 维护了两个不同的索引:一个用于读取,一个用于写入。
使用模式:
- 堆缓冲区。
- 直接缓冲区。
- 复合缓冲区
字节操作:
![](https://img.haomeiwen.com/i9118347/7ef74a1ef4864179.png)
- 随机访问索引。
- 顺序访问索引。
- 可丢弃字节。
- 可读字节。
- 可写字节。
- 索引管理。
- 派生缓冲区(slice、copy)。
索引的管理可以通过调用 markReaderIndex()、markWriterIndex()、resetWriterIndex() 和resetReaderIndex()来标记和重置 ByteBuf 的 readerIndex 和 writerIndex读、写操作。
读写操作方法:
- getByte(int):返回给定索引处的字节。
- getBytes(int,outStream,...):将该缓冲区中从给定索引开始的数据传送到指定的目的地。
- readByte():返回当前 readerIndex 处的字节,并将 readerIndex 增加 1。
- readBytes(byte[] dst, int dstIndex, int length):将当前 ByteBuf 中从当前 readerIndex 处开始的数据传送到一个目标 ByteBuf 或者 byte[],从 目标的 dstIndex 开始的位置。本地的readerIndex 将被增加已经传
输的字节数。
分配:
- ByteBufAllocator(接口、池化)
- Unpooled(未池化)
- ByteBufUtil(静态辅助方法)
引用计数:
引用计数是一种通过在某个对象所持有的资源不再被其他对象引用时释放该对象所持有的资源来优化内存使用和性能的技术,都实现了 interface ReferenceCounted。
总结:
数据结构还是很重要的,任何数据最终还是要存储下来或者需要一个中间过渡,就像小船一样,一批一批的把人送到对岸;Netty的底层数据结构就是ByteBuf,一个类似于小船的容器,围绕着这个小船做了很多优化和设计。
网友评论