ChannelBuffer是netty自己的缓冲区,用于替代nio的Buffer,这种替代具有显著的优势,解决了Buffer存在的一些问题,满足了日常网络应用程序开发的需求。具有以下特点:
- 如果必要的话,可以定义自己的ChannelBuffer。
- 通过复合缓冲区CompositeChannelBuffer实现透明的零拷贝”Zero-Copy-Capable”。
- 提供了一个开箱即用的动态缓冲区DynamicChannelBuffer,其容量可动态扩大,就像StringBuffer。
- 不用在使用flip()进行读写反转了。
- 通常比ByteBuffer快。
零拷贝”Zero-Copy-Capable”机制是指在TCP/IP传输层接收到的多个数据包(一个数据包封装为一个 ChannelBuffer),在应用层组成了一个完整的协议报文数据,传统上,数据是从多个包结合将它们复制到一个新的字节缓冲区,而零拷贝组合已有缓冲区为一个对外透明的缓冲区,提供给应用层使用,从而消除了缓冲区的复制。如下图所示:
其类图如下:
一、属性
- readerIndex,读指针。
- writerIndex,写指针。
- markedReaderIndex,读标志位。
- markedWriterIndex,写标志位。
其中:0<=readerIndex<=writerIndex<=capacity()markWriterIndex():markedWriterIndex = writerIndex resetWriterIndex():writerIndex = markedWriterIndex;
markReaderIndex():markedReaderIndex = readerIndex resetReaderIndex():readerIndex = markedReaderIndex;
HeapChannelBuffer跟NIO HeapByteBuffer作用相当,内部包含属性byte[] array,在堆上建立缓冲区。它有两个子类:BigEndianHeapChannelBuffer
和LittleEndianHeapChannelBuffer。
这里有个很基础的概念:字节序(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的capacity。lastAccessedComponentId指向整个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
分享到:
相关推荐
springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合...
Netty基础,用于学习Netty,参考黑马程序员的netty教程
netty-buffer-4.1.32.Final-sources.jar netty-buffer-4.1.32.Final.jar netty-build-22-sources.jar netty-build-22.jar netty-codec-4.1.32.Final-sources.jar netty-codec-4.1.32.Final.jar netty-codec-...
Netty (netty-netty-4.0.56.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...
Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...
Netty (netty-netty-3.10.6.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...
跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty is a NIO client server framework which ...
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见...
本jar包为最新的netty-all-4.1.29c.jar 可导入直接用 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架...
《Netty进阶之路:跟着案例学Netty》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...
netty-3.2.5.Final.jar netty包
Netty进阶之路,跟着案例学Netty,李林峰大神新作。值得一读。
springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot...
基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生...
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty is a NIO client server framework which ...
Netty在Android开发中的应用实战系列(一)——— 搭建服务端与客户端:https://azhon.blog.csdn.net/article/details/100569489 Netty在Android开发中的应用实战系列(二)——— Encoder | Decoder | Handler 的...
netty编程实战第三版,Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。
JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA...
Netty入门教程