Skip navigation links

Package io.netty.buffer

抽象字节缓冲区 - 表示低级二进制和文本消息的基本数据结构。

See: 描述

Package io.netty.buffer Description

抽象字节缓冲区 - 表示低级二进制和文本消息的基本数据结构。 Netty使用它自己的缓冲区API而不是NIO ByteBuffer来表示一个字节序列。 这种方法比使用ByteBuffer有显着的优势。 Netty的新缓冲区类型ByteBuf设计从根本上解决了ByteBuffer的问题,并满足了网络应用程序开发人员的日常需求。 列出一些很酷的功能:

可扩展性

ByteBuf具有丰富的操作集,可针对快速协议实施进行优化。 例如, ByteBuf提供了访问无符号值和字符串以及在缓冲区中搜索特定字节序列的各种操作。 您还可以扩展或包装现有的缓冲区类型以添加方便的访问器。 自定义缓冲区类型仍然实现ByteBuf接口,而不是引入不兼容的类型。

透明零拷贝

要将网络应用程序的性能提升到极致,您需要减少内存复制操作的数量。 你可能有一组缓冲区可以被分割并组合成一个完整的消息。 Netty提供了一个复合缓冲区,它允许您从任意数量的现有缓冲区中创建一个新的缓冲区,而无需复制内存。 例如,一条消息可以由两部分组成; 标题和正文。 在模块化应用中,这两个部分可以由不同的模块生成,并在消息发出后进行组装。
  +--------+----------+
 | header |   body   |
 +--------+----------+ 
如果使用ByteBuffer则必须创建一个新的大缓冲区,并将这两个部分复制到新缓冲区中。 或者,您可以在NIO中执行收集写入操作,但它限制您将缓冲区组合表示为ByteBuffer的数组而不是单个缓冲区,从而打破抽象并引入复杂的状态管理。 此外,如果您不打算从NIO频道读取或写入,这是没有用的。
  // The composite type is incompatible with the component type.
 ByteBuffer[] message = new ByteBuffer[] { header, body }; 
相比之下, ByteBuf没有这样的警告,因为它是完全可扩展的并且具有内置的复合缓冲区类型。
  // The composite type is compatible with the component type.
 ByteBuf message = Unpooled.wrappedBuffer(header, body);

 // Therefore, you can even create a composite by mixing a composite and an
 // ordinary buffer.
 ByteBuf messageWithFooter = Unpooled.wrappedBuffer(message, footer);

 // Because the composite is still a ByteBuf, you can access its content
 // easily, and the accessor method will behave just like it's a single buffer
 // even if the region you want to access spans over multiple components.  The
 // unsigned integer being read here is located across body and footer.
 messageWithFooter.getUnsignedInt(
     messageWithFooter.readableBytes() - footer.readableBytes() - 1); 

自动容量扩展

许多协议定义了可变长度的消息,这意味着在构造消息之前无法确定消息的长度,或者精确地计算长度是困难和不方便的。 这就像当你建立一个String 您经常估计结果字符串的长度,并让StringBuffer扩展。
  // A new dynamic buffer is created.  Internally, the actual buffer is created
 // lazily to avoid potentially wasted memory space.
 ByteBuf b = Unpooled.buffer(4);

 // When the first write attempt is made, the internal buffer is created with
 // the specified initial capacity (4).
 b.writeByte('1');

 b.writeByte('2');
 b.writeByte('3');
 b.writeByte('4');

 // When the number of written bytes exceeds the initial capacity (4), the
 // internal buffer is reallocated automatically with a larger capacity.
 b.writeByte('5'); 

更好的性能

ByteBuf最常用的缓冲区实现是一个非常薄的字节数组封装(即byte[] )。 ByteBuffer不同,它没有复杂的边界检查和索引补偿,因此JVM更容易优化缓冲区访问。 更复杂的缓冲区实现仅用于分片缓冲区或复合缓冲区,它的性能和ByteBuffer
Skip navigation links

Copyright © 2008–2018 The Netty Project. All rights reserved.

公众号(分布式编程)