文档章节

九. netty学习之 ByteBuf

plugin
 plugin
发布于 2015/11/08 20:02
字数 478
阅读 148
收藏 1

ByteBuf的分配

一. ByteBufAllocator 池类
	可分配基于堆的或者直接内存的ByteBuf
	获得ByteBufAllocator引用的的两种方式:
		channel.alloc();
		ctx.alloc();
	ByteBufAllocator的两种实现:
		PooledByteBufAllocator
		UnpooledByteBufAllocator
二.Unpooled 非池化的Bytebuf

三.ByteBufUtil

ByteBuf 和 ByteBufHolder

ByteBuf的主要有读写两个指针,这是他比原生ByteBuffer方便和易于理解的地方 read*, write开头的方法会改变索引,但是set将不会改变索引位置 |**** 版本号 4个字节的长度 具体的内容****|

ByteBuf 的使用模式

  1. 堆缓冲区(基于数组实现的)
所以可以通过hasArray判断是否支持数组
ByteBuf heapBuf = ...;
	if (heapBuf.hasArray()) {               //1
	    byte[] array = heapBuf.array();     //2
	    int offset = heapBuf.arrayOffset() + heapBuf.readerIndex();             //3
	    int length = heapBuf.readableBytes();//4
	    handleArray(array, offset, length); //5
	}
  1. 直接缓冲区
 ByteBuf directBuf = ...
		if (!directBuf.hasArray()) {            //1
		    int length = directBuf.readableBytes();//2
		    byte[] array = new byte[length];    //3
		    directBuf.getBytes(directBuf.readerIndex(), array);     //4 
		    handleArray(array, 0, length);  //5
		}
  1. 复合缓冲区(CompositeByteBuf )

     hasArray始终返回false
    
CompositeByteBuf messageBuf = ...;
	ByteBuf headerBuf = ...; // 可以支持或直接
	ByteBuf bodyBuf = ...; // 可以支持或直接
	messageBuf.addComponents(headerBuf, bodyBuf);
	// ....
	messageBuf.removeComponent(0); // 移除头 //2

	for (int i = 0; i < messageBuf.numComponents(); i++) {                      //3
	    System.out.println(messageBuf.component(i).toString());
	}
	
访问数据
	CompositeByteBuf compBuf = ...;
	int length = compBuf.readableBytes();   //1
	byte[] array = new byte[length];        //2
	compBuf.getBytes(compBuf.readerIndex(), array); //3
	handleArray(array, 0, length);  //4

随机访问索引: 如getByte,不会改变索引 可丢弃的字节重新利用: discardReadBytes(); 索引操作: markWriterIndex() markReaderIndex() resetReaderIndex() resetWriterIndex() clear() 比 discardReadBytes()成本更低 查询操作: forEachByte int index = buffer.forEachByte(ByteBufProcessor.FIND_CR); forEachByte(ByteBufProcessor.FIND_NUL) 衍生的缓冲区: 代表一个专门的展示 ByteBuf 内容的“视图" 这种视图由下面几种方法产生 duplicate(), slice(), slice(int, int),readOnly(),order(ByteOrder) 这种视图和源是数据共享的吗? 读写索引是一样的吗? 标记索引是一样的吗? 答:都是共享的

拷贝: copy()和copy(int, int) 这个副本是独立的, 和源数据不共享 需要某段数据: slice(int, int) 和源数据是共享的 读写操作: set写入/get读取不会改变索引 write/read

© 著作权归作者所有

plugin
粉丝 28
博文 28
码字总数 12617
作品 0
淮安
私信 提问
《netty入门与实战》笔记-03:数据传输载体 ByteBuf 介绍

ByteBuf结构 首先,我们先来了解一下 ByteBuf 的结构 以上就是一个 ByteBuf 的结构图,从上面这幅图可以看到: ByteBuf 是一个字节容器,容器里面的的数据分为三个部分,第一个部分是已经丢弃...

Funcy1122
2018/10/21
144
0
第五章:Buffers(缓冲)

本章介绍 ByteBuf ByteBufHolder ByteBufAllocator 使用这些接口分配缓冲和执行操作 每当你需要传输数据时,它必须包含一个缓冲区。Java NIO API自带的缓冲区类是相当有限的,没有经过优化,...

李矮矮
2016/09/23
36
0
Netty精粹之玩转NIO缓冲区

在JAVA NIO相关的组件中,ByteBuffer是除了Selector、Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写入Channel,或是从Channel读入Buffer;...

Float_Luuu
2016/03/13
3K
0
netty 学习 (3)发送对象

Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,例如http协议中,就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象。基于这个思路,我自定义一种...

yaokangjun
2014/06/04
7.1K
1
感悟优化——Netty对JDK缓冲区的内存池零拷贝改造

NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf。 ByteBuf对ByteBuffer做了大量的优化,比如说内存池,零拷贝,引用计数(...

Janti
2018/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
23分钟前
20
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部