Netty的ByteBuf缓冲区实现地比Java本身的ByteBuffer更加灵活,方便。它的类结构也比较复杂,这里只说ByteBuf核心的几个要点。
1. 最重要的是要理解为什么要ByteBuf这个组件。主要还是因为基于select / poll / epoll这种IO多路复用技术的NIO是非阻塞同步IO的模型,由于是同步IO,需要用户线程自己来处理IO的读写,由于是非阻塞的,每次调用read, write读写的字节数是不确定的,所以非阻塞同步IO必须有缓冲区这个组件来保存每次读写的中间状态,通过缓冲区来确定是否读写完成。更多内容请参考http://blog.csdn.net/iter_zc/article/details/39291647
2. ByteBuf不是对ByteBuffer的封装,而是重新实现了一个缓冲区。ByteBuffer只使用了一个position指针来记录当前的读写位置,ByteBuf使用了两个指针readerIndex, writerIndex分别来记录当前的读写位置,使用起来更加简单和方便。
3. ByteBuffer是一个固定长度的缓冲区,当put方法要写的数据大于可写的容量时会抛出异常。ByteBuf改进了这个设计,支持自动扩容。每次put之前会检查是否可以完全写入,如果不能,就会自动扩展ByteBuf的容量,保证put方法不会抛出异常。
public ByteBuf writeInt(int value) { ensureWritable(4); _setInt(writerIndex, value); writerIndex += 4; return this;} public ByteBuf ensureWritable(int minWritableBytes) { if (minWritableBytes < 0) { throw new IllegalArgumentException(String.format( "minWritableBytes: %d (expected: >= 0)", minWritableBytes)); } if (minWritableBytes <= writableBytes()) { return this; } if (minWritableBytes > maxCapacity - writerIndex) { throw new IndexOutOfBoundsException(String.format( "writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s", writerIndex, minWritableBytes, maxCapacity, this)); } // Normalize the current capacity to the power of 2. int newCapacity = calculateNewCapacity(writerIndex + minWritableBytes); // Adjust to the new capacity. capacity(newCapacity); return this;}//UnpooledHeapByteBuf的capacity方法来自动扩容public ByteBuf capacity(int newCapacity) { ensureAccessible(); if (newCapacity < 0 || newCapacity > maxCapacity()) { throw new IllegalArgumentException("newCapacity: " + newCapacity); } int oldCapacity = array.length; if (newCapacity > oldCapacity) { byte[] newArray = new byte[newCapacity]; System.arraycopy(array, 0, newArray, 0, array.length); setArray(newArray); } else if (newCapacity < oldCapacity) { byte[] newArray = new byte[newCapacity]; int readerIndex = readerIndex(); if (readerIndex < newCapacity) { int writerIndex = writerIndex(); if (writerIndex > newCapacity) { writerIndex(writerIndex = newCapacity); } System.arraycopy(array, readerIndex, newArray, readerIndex, writerIndex - readerIndex); } else { setIndex(newCapacity, newCapacity); } setArray(newArray); } return this;}private void setArray(byte[] initialArray) { array = initialArray; tmpNioBuf = null;}
4. 和ByteBuffer一样,ByteBuf也支持堆内缓冲区和堆外直接缓冲区,根据经验来说,底层IO处理线程的缓冲区使用堆外直接缓冲区,减少一次IO复制。业务消息的编解码使用堆内缓冲区,分配效率更高,而且不涉及到内核缓冲区的复制问题。
5. ByteBuf的堆内缓冲区又分为内存池缓冲区PooledByteBuf和普通内存缓冲区UnpooledHeapByteBuf。PooledByteBuf采用二叉树来实现一个内存池,集中管理内存的分配和释放,不用每次使用都新建一个缓冲区对象。UnpooledHeapByteBuf每次都会新建一个缓冲区对象。在高并发的情况下推荐使用PooledByteBuf,可以节约内存的分配。在性能能够保证的情况下,可以使用UnpooledHeapByteBuf,实现比较简单。
相关推荐
Netty ByteBuf 的零拷贝(Zero-Copy)理解 Netty 中的零拷贝(Zero-Copy)是指在操作数据时,不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域,这样可以减少 CPU 的负载和内存带宽的占用。 Zero-Copy 通常...
ByteBuf是Java的Netty框架中的一个核心组件,它是一个高效、线程安全的字节缓冲区,用于处理网络I/O。在Rust编程语言中,`bytebuf-rs`项目是一个模仿Netty ByteBuf设计的库,旨在提供类似的性能特性和功能。本文将...
netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。
丢弃服务器Netty 实现时间服务器Java ByteBuffer使用案例Netty ByteBuf使用案例Netty ByteBuf 的清晰使用模式Netty实现无连接协议Echo服务器、客户端Java线程池示例Java Reactor 示例基于自定义换行的解码器TCP...
将Netty ByteBuf的相关类,进行梳理总结、源码分析,通过思维导图的注释看源码!
ByteBuf是Netty提供的字节缓冲区,它是Java NIO ByteBuffer的一个增强版。ByteBuf提供了一种更高效的内存管理方式,支持读写索引独立,避免了BufferOverflow和BufferUnderflow等异常。它还支持堆内和堆外内存,以及...
2. **Netty中的 ByteBuf**:Netty的ByteBuf提供了多种方法来读写字节,但并未涉及字符编码。例如,`writeBytes()`用于写入字节数组,`writeCharSequence()`则允许指定编码写入字符序列。在处理字符串时,确保使用`...
Netty 提供了 `ByteBuf` 类作为缓冲区,用于高效地存储和操作字节数据。`ByteBuf` 支持读写操作,可以用于处理16进制数据。通过 `ByteBuf` 的方法,如 `readByte()`、`writeByte()`、`readInt()` 和 `writeInt()` ...
- **Buffer**:Netty的ByteBuf提供了高效的数据存储和传输功能,优于Java原生的ByteBuffer。 4. **Netty编程模型**:包括客户端和服务端的创建、连接建立、数据读写、异常处理等,通过编写自定义的Handler来实现...
此外,Netty的ByteBuf类是高效内存管理的关键,它提供了缓冲区的读写操作,避免了不必要的数据拷贝。 在高级特性部分,书籍会涉及Netty的编解码器,如LineBasedFrameDecoder用于处理以换行符分隔的协议,以及...
2. **ByteBuf操作**:Netty的ByteBuf提供了高效的字节操作,支持读写索引的独立控制,以及读写区域的分离。在解析过程中,会用到readInt(), readByte()等方法来读取消息头和消息体的数据。 3. **消息体解析**:由于...
首先,我们需要了解Netty的ByteBuf和ChannelHandlerContext。ByteBuf是Netty中的缓冲区,用于存储和读写网络数据。ChannelHandlerContext则提供了与通道相关的操作,包括读写数据、处理事件等。 在构建WebSocket...
《Netty实战》是针对Java开发者的一本技术指南,它深入介绍了如何利用Netty这个高性能、异步事件驱动的网络应用程序框架来构建高效且可扩展的网络应用。Netty不仅简化了网络编程的复杂性,还提供了丰富的特性和组件...
此外,Netty的ByteBuf是高效的数据缓冲区,提供了比Java NIO Buffer更友好的API。它支持预读和后写,可以在不复制数据的情况下进行读写操作,从而提高了性能。 书中的代码案例会涵盖如何创建服务器、建立连接、处理...
书中会介绍Channel、Selector、Buffer等NIO核心组件,并展示如何在Netty中使用它们。 接着,书中会深入讲解Netty的EventLoop和EventLoopGroup。EventLoop是Netty中的工作线程,负责处理I/O事件和执行用户定义的任务...
- Netty 的 ByteBuf 提供了高效的内存管理,避免了频繁的字节数组拷贝。 2. **WebSocket 协议** - WebSocket 协议通过 HTTP/HTTPS 协议握手建立连接,之后即可在连接上进行双向数据传输,无需重复的 HTTP 请求/...
此外,还会涉及ByteBuf,这是Netty提供的高效内存管理工具,用于替代Java的ByteBuffer,提供更友好的API和更好的性能。 Netty的案例实战部分可能会涵盖常见网络协议的实现,如HTTP、HTTPS、FTP、WebSocket等,这些...
4. **高效的内存管理**:Netty 使用ByteBuf作为字节缓冲区,它提供了一种更高效的方式管理网络通信中的内存,避免了Java原生的ByteBuffer带来的性能损耗。 5. **强大的编码解码器**:Netty 提供了各种编码解码器,...
你可以通过阅读源码学习到如何使用ChannelHandlerContext进行事件处理,如何定义自定义的ByteBuf以优化内存管理,以及如何编写频道管道(ChannelPipeline)来处理进来的网络请求。 Netty提供了丰富的协议支持,包括...
2. **ByteBuf**:Netty 提供了 ByteBuf 作为缓冲区,相比传统的 ByteBuffer 更加高效,支持零拷贝,方便进行数据读写操作。 3. **ChannelHandler**:这是 Netty 中的核心组件,负责处理网络事件,如连接、读写、...