003——Netty之Buffer、Channel以及多路复用器Selector
Buffer
1、缓冲区类型

2、缓冲区定义
(1)Buffer是一个对象,其中包含写入与读出的数据。是新IO与原IO的重要区别。任何情况下访问NIO中的数据都需要通过缓存区进行操作。
(2)Buffer在代码中体现就是一个数组,本质上就是内存中的一块区域。
Buffer源码
public abstract class Buffer {
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
// Used only by direct buffers
// NOTE: hoisted here for speed in JNI GetDirectBufferAddress
long address;
// Creates a new buffer with the given mark, position, limit, and capacity,
// after checking invariants.
//
Buffer(int mark, int pos, int lim, int cap) { // package-private
if (cap < 0)
throw new IllegalArgumentException("Negative capacity: " + cap);
this.capacity = cap;
limit(lim);
position(pos);
if (mark >= 0) {
if (mark > pos)
throw new IllegalArgumentException("mark > position: ("
+ mark + " > " + pos + ")");
this.mark = mark;
}
}
...省略
}

(1)BUffer的四个属性。mark、position、limit、capacity。
[1] capacity:缓存区容量。设定即不可更改,比如 capacity 为 1024 的 IntBuffer,代表其一次可以存放 1024 个 int 类型的值。当Buffer 的容量达到 capacity,需要清空 Buffer,才能重新写入值。[2] limit:写模式是记录最大能够写入的数据。读模式下limit等于Buffer实际大小。[3] position:写模式下position初始值为0,当写入一个值时,position+1,指向下次写入位置。读模式下position会置0,这时将会从头开始读取Buffer中的数据。[4] mark:Buffer#mark()记录当前position值,用于读写切换时还原position值。
(2)Netty提供了两个指针变量用于读写操作。分别是readerIndex与writeIndex。
+-------------------+------------------+------------------+ | discardable bytes | readable bytes | writable bytes | | | (CONTENT) | | +-------------------+------------------+------------------+ | | | | 0 <= readerIndex <= writerIndex <= capacity[1] readerIndex 到 writeIndex为可读度的字节缓存区。[2] writeIndex 到 capacity为可写的字节缓存区[3] 0 到 readerIndex为已读字节缓存区
Channel
Channel定义
通道是数据来源与数据写入的目的地。主要分为以下几种,分别是FileChannel(文件通道,用于文件的读和写
)、DatagramChannel(用于 UDP 连接的接收和发送)、SocketChannel(把它理解为 TCP 连接通道,简单理解就是 TCP 客户端)、ServerSocketChannel(TCP 对应的服务端,用于监听某个端口进来的请求)

NIO Channel与Java stream区别
- 对于同一个 Channel全双工,Stream(InputStream、OutputStream)要么读要么写
- Channel 可以非阻塞的读写 IO 操作,而 Stream 只能阻塞的读写 IO 操作。
- Channel 必须配合 Buffer 使用,总是先读取到一个 Buffer 中,又或者是向一个 Buffer 写入。也就是说,我们无法绕过 Buffer ,直接向 Channel 写入数据。

为什么Netty重写Channel?
- [1]Channel是Netty的核心,为了能够与整体架构融合在一起。(待确定)
参考
[1] http://ifeve.com/java-nio-all/
多路复用器Selector
Selector会不断轮询注册在其上的Channel,当某个Channel上发生事件,该Channel就处于就绪状态,会被轮询出来进行后续IO操作。
通过一个线程(多路复用器)Selector可以同时轮询多个Channel,不必一个连接一个线程以一对一的形式应对请求,极大地减少系统开销。

当读或写事件发生时,就会从Selector中获取想用的SelectorKey,SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据.
NIO服务端

003——Netty之Buffer、Channel以及多路复用器Selector的更多相关文章
- NIO的Buffer&Channel&Selector
java的NIO和AIO Buffer position.limit.capacity 初始化 Buffer 填充 Buffer 提取 Buffer 中的值 mark() & reset() ...
- Netty那点事: 概述, Netty中的buffer, Channel与Pipeline
Netty那点事(一)概述 Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户ne ...
- Netty服务端Channel注册Selector及绑定服务器端口
当服务端Channel 创建并且初始化完成之后,会将其注册到 selector,通过语句config().group().register(channel)进行注册工作,该方法最终调用 Abstrac ...
- Java NIO系列教程(六) 多路复用器Selector
多路复用器Selector是Java NIO编程的基础,熟练地掌握Selector对于掌握NIO编程至关重要.多路复用器提供选择已经就绪的任务的能力.简单来讲,Selector会不断地轮询注册在其上的 ...
- netty中的Channel、ChannelPipeline
一.Channel与ChannelPipeline关系 每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline.这项关联是永久性 的:Channel 既不能附加另外一个 ...
- Netty 源码 Channel(二)核心类
Netty 源码 Channel(二)核心类 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.Channel 类图 二. ...
- Netty 源码 Channel(二)主要类
Netty 源码 Channel(二)主要类 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.Channel 类图 二. ...
- Netty 源码 Channel(一)概述
Netty 源码 Channel(一)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Channel 为 Netty ...
- Netty服务端Channel的创建与初始化
Netty创建服务端Channel时,从服务端 ServerBootstrap 类的 bind 方法进入,下图是创建服务端Channel的函数调用链.在后续代码中通过反射的方式创建服务端Channel ...
随机推荐
- Excel中PMT函数的Java实现
public class PMT { /** * * 计算月供 * * @param rate * 年利率 年利率除以12就是月利率 * @param nper * 贷款期数,单位月 该项贷款的付款总 ...
- Greenplum客户端访问控制
1. 问题描述 Greenplum默认是对客户端不开放的,即客户端要访问Greenplum数据库,需要首先开通权限. 2. 解决方案: 2.1.安装greenplum-cc-web控制台. Gp的 ...
- 微信小程序开发--组件(4)
一.picker-view / picker-view-column <view> <view>{{year}}年{{month}}月{{day}}日</view> ...
- 算法导论--最小生成树(Kruskal和Prim算法)
转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...
- Excel催化剂开源第41波-网抓网络采集类库及工具分享
在VBA开发网抓程序中,会用到xmlhttp/winHttp.winHttprequest.5.1等组件,当时笔者也是这样进入了网抓领域的,这些都是非常过时的东西,在.Net的开发中,有大量的更好用的 ...
- Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术
Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术 Excel催化剂 2019.01.12 14:10* 字数 2948 阅读 41评论 0喜欢 0 编辑文章 在Excel催化剂的几大 ...
- ASP.NET Core 中的管道机制
首先,很感谢在上篇文章 C# 管道式编程 中给我有小额捐助和点赞的朋友们,感谢你们的支持与肯定.希望我的每一次分享都能让彼此获得一些收获,当然如果我有些地方叙述的不正确或不当,还请不客气的指出.好了, ...
- 关于C#调用WebServices的方法
2018-1-22 前情是我使用vs在引用高通的webservice时出现了下载错误导致无法引用这个服务,先是在网上查询了这个错误的问题及解决方案,将这个问题与解决方法发给了高通同事,可惜的是他也不清 ...
- HTTP 400 Bad request 原因
我在使用httpclient 发送http请求时遇到问题,请求报 400 Bad request.网上都在说下面这两个原因 400 是 HTTP 的状态码,主要有两种形式: 1.bad request ...
- 快速清理maven仓库中下载错误的文件
有时候使用pom文件下载依赖文件的时候突然网络异常,可能会出现依赖文件出现破损,导致怎么都不能使用,也没有重新下载. 之前解决办法是找到出现破损的文件并删除,让其重新下载,但是这样效率很低,也很难找到 ...