`

Netty ChannelBuffer 简介

 
阅读更多

ChannelBuffer是Netty中比较常用的一个类,其功能类似于字符数组,可以对其进行读写操作。

ChannelBuffer的模型图如下:

 +-------------------+------------------+------------------+
 | discardable bytes |  readable bytes  |  writable bytes  |
 |                   |     (CONTENT)    |                  |
 +-------------------+------------------+------------------+
 |                   |                  |                  |

 0      <=      readerIndex   <=   writerIndex    <=    capacity

 


如上图所示,一个ChannelBuffer被划分为三个部分:

1.discardable:表示已经读过的内容缓冲区

2.readable:表示可读的内容缓冲区

3.writable:表示可写的内容缓冲区

ChannelBuffer的这三个缓冲区由2个内部控制指针来控制:

readerIndex:控制读缓冲区首地址

writerIndex:控制写缓冲区首地址

因此,ChannelBuffer提供的大部分操作都是围绕readerIndex和writerIndex来进行的。

 


ChannelBuffer的常用方法如下:

1、

read()/skip()

从readerIndex读出或跳过指定数目的字节,同时readerIndex = readerIndex + byteNumber.如果readerIndex > capacity,表示读取下标越界,会抛出

IndexOutOfBoundsException异常

readable():boolean

如果buffer有可读内容(此时writerIndex > readerIndex),则返回true,否则返回false

readerIndex():int

返回readerIndex

readableBytes():int

返回可读的字节数目(writerIndex - readerIndex)

2、

write();

写入指定数目的字节,同时writerIndex = writerIndex + byteNumber. 如果writerIndex > capacity,表示写入下标越界,会抛出

IndexOutOfBoundsException异常

 

writable():boolean

如果buffer有可写入空间(此时writerIndex < capacity),则返回true,否则返回false。

 

writerIndex(): int

返回writerIndex

 

writeableIndex():int
返回可写入的字节数(capacity - writerIndex)。

3、discardReadBytes()

丢弃已读的内容。其执行过程如下:

调用discardReadBytes()之前:

+-------------------+------------------+------------------+
| discardable bytes |  readable bytes  |  writable bytes  |
+-------------------+------------------+------------------+
|                   |                  |                  |
0      <=      readerIndex   <=   writerIndex    <=    capacity

调用 discardReadBytes()方法后

+------------------+--------------------------------------+
|  readable bytes  |    writable bytes (got more space)   |
+------------------+--------------------------------------+
|                  |                                      |
readerIndex (0) <= writerIndex (decreased)    <=      capacity

4、clear()
丢弃所有的数据,并将readerIndex和writerIndex重置为0。

调用clear()之前
 +-------------------+------------------+------------------+
 | discardable bytes |  readable bytes  |  writable bytes  |
 +-------------------+------------------+------------------+
 |                   |                  |                  |
 0      <=      readerIndex   <=   writerIndex    <=    capacity

 

 调用clear()之后

 +---------------------------------------------------------+ |             
                 writable bytes (got more space)             | 
 +---------------------------------------------------------+ |                                                         | 
0 = readerIndex = writerIndex            <=            capacity

5、

markReaderIndex()
markWriterIndex()

保存readerIndex或writerIndex的状态

6、

resetReaderIndex()

resetWriterIndex()

重置readerIndex或writerIndex为最后一次保存的状态,如果没有保存过,则置为0

7、

duplicate()

slice()

拷贝和源目标共享buffer的数据区域,但是拷贝有自己的readerIndex和writerIndex以及markIndex,实际上只是拷贝了控制指针,数据区还是与源buffer共享。

8、

copy()

拷贝整个buffer,包括控制指针和数据区

测试代码如下:

package test;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;

public class ChannelBufferTest {

    /**
     *
     * @author lengxue
     * @date 11 Jul 2012 09:05:10
     * @param args
     * @note
     */
    public static void main( String[] args ) {
        // TODO Auto-generated method stub
        ChannelBuffer buffer = ChannelBuffers.buffer( 10 );
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.writeInt( 10 );
        System.out.println("after write one integer");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));

        buffer.writeInt( 10 );
        System.out.println("after write two integer");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        int i = buffer.readInt( );
        System.out.println("after read one integer: " + i);
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.discardReadBytes( );
        System.out.println("after discard read bytes");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.resetReaderIndex( );
        System.out.println("after reset reader index");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.resetWriterIndex( );
        System.out.println("after reset writer index");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
    }

}

结果输出如下:

readable bytes: 0
readable index: 0
writable bytes: 10
writable index: 0
after write one integer
readable bytes: 4
readable index: 0
writable bytes: 6
writable index: 4
after write two integer
readable bytes: 8
readable index: 0
writable bytes: 2
writable index: 8
after read one integer: 10
readable bytes: 4
readable index: 4
writable bytes: 2
writable index: 8
after discard read bytes
readable bytes: 4
readable index: 0
writable bytes: 6
writable index: 4
after reset reader index
readable bytes: 4
readable index: 0
writable bytes: 6
writable index: 4
after reset writer index
readable bytes: 0
readable index: 0
writable bytes: 10
writable index: 0

 

分享到:
评论

相关推荐

    Netty实现原理浅析

    - **高性能**:Netty的`ChannelBuffer`相比传统的`java.nio.ByteBuffer`具有更高的性能。 - **灵活性**:支持多种操作模式,如直接内存模式和堆内存模式。 - **安全性**:提供了更好的内存管理机制,避免了内存泄漏...

    netty 官方文档

    - **使用 POJO 替代 ChannelBuffer:**Netty 允许开发者使用普通的 Java 对象 (POJO) 来替代 ChannelBuffer 进行数据处理。 - **应用程序关闭:**介绍了如何优雅地关闭 Netty 应用程序,确保所有资源被正确释放。 #...

    Netty教程用户手册

    #### 一、Netty简介与问题解析 - **标题**:Netty教程用户手册 - **描述**:Netty教程用户手册为用户提供了一个全面了解Netty的基础,帮助初学者快速入门。 - **标签**:Netty教程用户手册、Netty、Netty用户手册 ...

    netty-3.2.5终极手册

    #### 一、Netty 3.2.5 终极手册简介 《Netty-3.2.5终极手册》是一本全面介绍Netty 3.2.5版本的指南书籍,旨在为开发者提供快速开发网络应用的方法与技巧。本书不仅涵盖了Netty的基本概念和入门教程,还深入探讨了其...

    Netty_3.2_中文用户手册

    此外,手册还指导开发者如何用 POJO 替换 ChannelBuffer,以提高代码的可读性和易用性,以及如何优雅地关闭应用程序。 第二章则深入介绍了 Netty 的架构概览,包括其丰富的缓存数据结构、统一的异步 I/O API、基于...

    netty pojo 文档

    netty pojo netty pojo替换 channelbuffer

    Netty+3.1中文用户手册

    - **使用 POJO 代替 ChannelBuffer**:介绍如何使用普通的 Java 对象(POJOs)替代 ChannelBuffer 进行数据交换,提高代码的可读性和可维护性。 - **关闭应用**:正确的关闭顺序对于资源释放至关重要,Netty 提供...

    Netty 3.1中文用户手册

    Netty 是一个专门为快速开发高性能、高可靠性网络应用而设计的 Java 框架。它提供了异步事件驱动的网络应用程序框架,使得开发者能够轻松创建网络服务器和客户端。Netty 3.1 中文用户手册提供了详细的指南,帮助...

    Netty实现原理浅析.pdf

    Netty使用`ChannelBuffer`接口来封装缓冲区的功能,提供了比标准Java NIO `ByteBuffer`更高级的操作方式。 1. **HeapChannelBuffer**:这是Netty提供的一个实现`ChannelBuffer`接口的具体类。它的数据存储在Java堆...

    netty权威指南第二版源码

    7. **Codec**:Netty 提供了一系列编解码器,用于将各种协议数据转换为 ChannelBuffer 和反向操作,如 HTTP、TCP、UDP 等。 通过对“Netty 权威指南第二版源码”的学习,你可以: - 理解 Netty 的事件模型和线程...

    Netty源码阅读笔记

    首先,ChannelBuffer是Netty中用于网络数据交换的字节容器。在Netty中,所有的网络数据都是通过ChannelBuffer进行读写的。它的作用类似于Java NIO中的ByteBuffer,但它提供了更加丰富的功能。ChannelBuffer有...

    netty 新NIO框架 文档

    #### 一、Netty框架简介 Netty是一款高性能的网络应用开发框架,它采用事件驱动的方式处理网络通信,主要用于简化网络编程的复杂度,提升开发效率与系统性能。根据给定文档的描述部分可以看到,Netty的设计理念旨在...

    Netty 3.2 用户手册

    这个过程介绍了如何构建一个基础的Netty服务端和客户端,以及如何处理ChannelBuffer,即Netty中的数据容器。 手册接着提供了对ReceivedData的详解,通过编写Echo服务,即对收到的任何消息进行回显,来进一步解释...

    Netty实现原理浅析.docx

    在数据处理方面,Netty 使用了ChannelBuffer接口,它是网络数据读写的基础。ChannelBuffer提供了高效的数据操作方法,支持零拷贝,减少了内存开销,提高了性能。同时,Netty 提供了多种ChannelBufferFactory,可以...

    Netty那点事(2)Netty中的bufferJava开

    6. **零拷贝**:Netty通过直接内存和ChannelBuffer的组合,实现了操作系统级别的零拷贝技术,有效降低了CPU的负载,提升了网络传输效率。 7. **安全性**:ByteBuf还提供了安全的边界检查,防止越界访问导致的运行时...

Global site tag (gtag.js) - Google Analytics