`
wydyyhwzx
  • 浏览: 9598 次
社区版块
存档分类
最新评论

netty ChannelBuffer

    博客分类:
  • nio
阅读更多

       ChannelBuffer是netty自己的缓冲区,用于替代nio的Buffer,这种替代具有显著的优势,解决了Buffer存在的一些问题,满足了日常网络应用程序开发的需求。具有以下特点:

  1. 如果必要的话,可以定义自己的ChannelBuffer。
  2. 通过复合缓冲区CompositeChannelBuffer实现透明的零拷贝”Zero-Copy-Capable”。
  3. 提供了一个开箱即用的动态缓冲区DynamicChannelBuffer,其容量可动态扩大,就像StringBuffer。
  4. 不用在使用flip()进行读写反转了。
  5. 通常比ByteBuffer快。
       零拷贝”Zero-Copy-Capable”机制是指在TCP/IP传输层接收到的多个数据包(一个数据包封装为一个 ChannelBuffer),在应用层组成了一个完整的协议报文数据,传统上,数据是从多个包结合将它们复制到一个新的字节缓冲区,而零拷贝组合已有缓冲区为一个对外透明的缓冲区,提供给应用层使用,从而消除了缓冲区的复制。如下图所示:
其类图如下:
 



  
一、属性
  1. readerIndex,读指针。
  2. writerIndex,写指针。
  3. markedReaderIndex,读标志位。
  4. markedWriterIndex,写标志位。
其中:0<=readerIndex<=writerIndex<=capacity()
markWriterIndex():markedWriterIndex = writerIndex  resetWriterIndex():writerIndex = markedWriterIndex;
markReaderIndex():markedReaderIndex = readerIndex  resetReaderIndex():readerIndex = markedReaderIndex;
HeapChannelBuffer跟NIO HeapByteBuffer作用相当,内部包含属性byte[] array,在堆上建立缓冲区。它有两个子类:BigEndianHeapChannelBufferLittleEndianHeapChannelBuffer。这里有个很基础的概念:字节序(ByteOrder/Endianness),字节序规定了多于一个字节的数字,如何在内存中表示。BIG_ENDIAN(大端序)表示高位在前,按照大端序,整型数12会被存储为0 0 0 12这样四个字节,而LITTLE_ENDIAN则正好相反。
 
DynamicChannelBuffer是动态缓冲区,它实现自动扩容的核心在于ensureWritableBytes方法,算法很简单:在写入前做容量检查,容量不够时,新建一个容量x2的buffer。包含属性ChannelBufferFactory factory,ByteOrder endianness,ChannelBuffer buffer。
 
CompositeChannelBuffer:A virtual buffer which shows multiple buffers as a single merged buffer。包含属性ByteOrder order,ChannelBuffer[] components,int[] indices,int lastAccessedComponentId,boolean gathering。其中indices.length = components.length+1, indices[i]: 若i<components.length,值为components[i]的readerIndex在整个CompositeChannelBuffer中index位置;若i=components.length,值为整个CompositeChannelBuffer的capacitylastAccessedComponentId指向整个CompositeChannelBuffer的readerIndex或writerIndex当前所在的components位置。
 
ByteBufferBackedChannelBuffer封装了NIO ByteBuffer的类,用于实现堆外内存的Buffer(使用NIO的DirectByteBuffer),当然它也可以放其他的ByteBuffer的实现类。包含属性ByteBuffer buffer,ByteOrder order,int capacity。
 

WrappedChannelBuffer都是几个对已有ChannelBuffer进行包装,完成特定功能的类。

类名 入口 功能
SlicedChannelBuffer ChannelBuffer.slice()
ChannelBuffer.slice(int,int)
某个ChannelBuffer的一部分
TruncatedChannelBuffer slice(int index, int length) 某个ChannelBuffer的一部分, 可以理解为其实位置为0的SlicedChannelBuffer
DuplicatedChannelBuffer ChannelBuffer.duplicate() 与某个ChannelBuffer使用同样的存储, 区别是有自己的index
ReadOnlyChannelBuffer ChannelBuffers
.unmodifiableBuffer(ChannelBuffer)
不可变的buffer
 二、构造ChannelBuffer
通过工具类ChannelBuffers的静态方法来构造各种ChannelBuffer。
 
  • 大小: 41.3 KB
  • 大小: 24.1 KB
  • 大小: 19.7 KB
分享到:
评论

相关推荐

    Netty+3.1中文用户手册.doc

    Netty 使用 ChannelBuffer 存储接收到的数据,这是一个高效且可定制的字节缓冲区。开发者可以通过 ChannelBuffer 获取和解析数据。 1.4. 响应协议服务 响应服务通常涉及到在接收到特定事件后,通过 ChannelHandler ...

    Netty实现原理浅析

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

    netty 官方文档

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

    netty3.1中文用户手册

    - **使用 POJO 代替 `ChannelBuffer`**:为了更好地适应业务逻辑,Netty 允许使用普通的 Java 对象(POJO)来封装数据,而不是直接操作 `ChannelBuffer`。 - **关闭应用**:正确地关闭 Netty 应用是非常重要的,这...

    Netty教程用户手册

    - **1.8 使用POJO代替`ChannelBuffer`**:学习如何使用普通的Java对象(POJOs)代替`ChannelBuffer`进行数据处理。 - **1.9 应用程序关闭**:了解如何优雅地关闭Netty应用程序。 - **1.10 总结**:回顾本章所学的...

    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.2.5终极手册

    Netty内部使用高效的缓冲数据结构(ChannelBuffer),支持快速的数据读写操作。 ##### 2. 统一的异步I/O API Netty提供了一个统一的异步I/O API,使得开发人员能够轻松地处理各种网络通信任务,无论是在NIO还是...

    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 的事件模型和线程...

    netty3.1中文用户手册.pdf

    ### Netty 3.1 中文用户手册关键知识点解析 #### 序言 - **Netty的意义**:本节简要介绍了Netty的目的及其在现代网络应用开发中的重要性。 #### 1. 问题 - **常规协议局限性**:讨论了通用协议(如HTTP)在面对...

    Netty源码阅读笔记

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

    Netty 3.1 中文用户手册

    ### Netty 3.1 中文用户手册知识点总结 #### 序言与背景 - **Netty** 是一款由 JBoss 提供的支持异步、事件驱动的网络应用程序框架,主要用于简化可扩展网络应用的开发工作。 - **目标**: 旨在帮助开发者快速构建高...

    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还提供了安全的边界检查,防止越界访问导致的运行时...

    netty 新NIO框架 文档

    Netty提供了一种称为`ChannelBuffer`的数据结构,用于管理和操作网络数据。这种数据结构比传统的Java NIO `ByteBuffer`更加灵活高效,可以更好地适应网络应用的需求。 ##### 3.2 异步I/O API Netty基于Java NIO构建...

Global site tag (gtag.js) - Google Analytics