Netty ChannelBuffer
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
Netty ChannelBuffer相关推荐
- 发布一个基于 Reactor 模式的 C++ 网络库
发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...
- 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记
文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...
- muduo网络库:18---muduo简介之(muduo库的由来、编译安装、目录结构、代码结构、线程模型)
一.由来 2010年3月陈硕先生写了一篇<学之者生,用之者死--ACE历史与简评>(文章参阅:https://blog.csdn.net/Solstice/article/details/ ...
- netty里集成spring注入mysq连接池(一)
netty的性能非常高,能达到8000rps以上,见 各个web服务器的性能对比测试 1.准备好需要的jar包 spring.jar //spring包 netty-3.2.4. ...
- Netty、Kafka中的零拷贝技术到底有多牛?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/ggFBd 零拷贝,从字面意思理解就是数据不需 ...
- 深入探秘 Netty、Kafka 中的零拷贝技术!
作者:ksfzhaohui 原文:juejin.im/post/5cad6f1ef265da039f0ef5df 零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能.我们也经常在 J ...
- Netty源码解析1-Buffer
大数据成神之路系列: 请戳GitHub原文: github.com/wangzhiwubi- 更多文章关注:多线程/集合/分布式/Netty/NIO/RPC Java高级特性增强-集合 Java高级特 ...
- netty之ObjectSizeEstimator
2019独角兽企业重金招聘Python工程师标准>>> 今天测试netty,之前一直会出现阻塞,最后测试服务器所有线程挂起,最后无法正常工作, ExecutionHandler, ...
- Netty深入浅出(一)入门
传统Socket中,NIO和IO的比较(Nio知识回顾) IO 阻塞点: server.accept(); 和 单线程情况下只能有一个客户端 用线程池可以有多个客户端连接,但是非常消耗性能 NIO s ...
- Netty详解(四):Netty 整体架构
1. 概述 Netty是JBoss出品的高效的Java NIO开发框架,本文将主要分析Netty实现方面的东西. Netty总体架构图: 2. Buffer org.jboss.netty.buffe ...
最新文章
- jQuery 选择器汇总-思维导图-选择器
- 【转】Hibernate和IBatis对比
- 牛客题霸 SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no
- 有向加权图 最大弱连通分支_买入加权组合式等价对敲
- 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
- b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树
- EasyUI---layout布局、树形组件、选项卡tabs
- Eclipse自动部署项目到Tomcat的webapps下的有效方法
- edge chrome Android,微软Edge浏览器安卓版已上架:采用Chrome引擎
- 惠普T5325 惠普T5565 惠普T5400 瘦客机评测
- 摄像机成像原理(模型)与标定
- Exception in thread “main“ java.nio.file.NoSuchFileException: 123.txt
- 设计冲刺案例|谷歌设计冲刺用4天确定热卖智能相机Clips的功能特性
- codelite开发php,C++跨平台开发环境(CodeLite)
- SQL SERVE 2008远程连接 提示sqlserver远程主机强迫关闭了一个现有连接
- 目前最赚钱快的微信营销几种玩法和模式
- 属鸡适不适合学计算机,生肖属相鸡适宜什么职业(详解)
- r720支持多少频率的内存吗_内存条全面选购指南,2020年有哪些内存条值得推荐...
- 「从 Windows 到 macOS」快速理顺两大系统之间的差异
- logback中logger的 additivity 属性
热门文章
- 12C RAC中的一个数据库实例自动crash并报ORA-27157、ORA-27300等错误
- Java字符串首字母大写
- win8蓝屏错误代码DPC_WATCHDOG_VIOLATION您的电脑遇到错误需要重启修复
- [Python]关键字is和操作符==
- 技巧:linux开机自动启动脚本(转)
- C# 基础-CLR-类型【0】
- childNodes.length 的临时保存
- Codeforces - 570D 离散DFS序 特殊的子树统计 (暴力出奇迹)
- Androidstudio加载工程很慢解决方案
- 开启A20线(部分译)