Netty学习前置知识:Channel详解

一、前言

在上一篇文章中我们学习了NIO三大组件中的Buffer,对其属性还有方法做了解释,今天我们学习的是NIO三大组件中的Channel。

二、Channel

Netty学习前置知识:Channel详解_第1张图片

我们知道NIO是面向缓冲区(Buffer)的,这里所说的面向缓冲区指的是数据的读写是发生在缓冲区的,从图中可以看出Channel连接着Buffer。
Netty学习前置知识:Channel详解_第2张图片

1、Channel是什么

A nexus for I/O operations.
A channel represents an open connection to an entity such as a hardware device, a file, a network socket, or a program component that is capable of performing one or more distinct I/O operations, for example reading or writing.
A channel is either open or closed. A channel is open upon creation, and once closed it remains closed. Once a channel is closed, any attempt to invoke an I/O operation upon it will cause a ClosedChannelException to be thrown. Whether or not a channel is open may be tested by invoking its isOpen method.
Channels are, in general, intended to be safe for multithreaded access as described in the specifications of the interfaces and classes that extend and implement this interface.
翻译:
Channel表示与能够执行一个或多个不同I/O操作(例如读取或写入)的实体(例如硬件设备、文件、网络套接字或程序组件)的开放连接。
通道打开或关闭。通道在创建时打开,一旦关闭,它将保持关闭状态。一旦通道关闭,任何对其调用I/O操作的尝试都会引发ClosedChannelException。可以通过调用其isOpen方法来测试通道是否打开。
通常,通道对于多线程访问是安全的,如扩展和实现该接口的接口和类的规范中所述。

2、Channel的实现类

Channel是一个接口,其中只定义了两个方法(是否开启、关闭Channel)这显然是不够的,所以通过各种子接口(抽象类)来扩展功能。其中几个通过名称就能理解其作用。
Netty学习前置知识:Channel详解_第3张图片
ReadableByteChannel:该接口提供了从缓冲区读取字节的能力。
WritableByteChannel:该接口提供了往缓冲区写字节的能力。
InterruptibleChannel:该接口提供了Channel响应中断的能力。
NetworkChannel:该接口提供了绑定网络Socket的能力。
SelectableChannel:可通过选择器多路复用的Channel。(在之前的文章中我们有提到多路复用,这也是NIO效率较高的原因之一)
由于Channel的实现类众多,我们不可能一个个看过去,这里就选取其中的一个来作为学习对象,我们选的是selectableChannel。

3、SelectableChannel

SelectableChannel(下文简称SC)翻译成中文就是可被选择的信道,如何理解这个可被选择?那就要结合NIO的模型了,在上面的图中,我们知道在Channel的上层有一个名为Selector的组件,这就是选择器,其作用是通过一定的方式(具体方式放在之后的文章中解释)去选取Channel。(部分源码如下)
Netty学习前置知识:Channel详解_第4张图片
SC提供了一些列的方法,例如注册到Selector、设置IO模式(阻塞、非阻塞)等。我们先看下提供的方法
1、public abstract SelectorProvider provider()
返回创建当前Channel的SelectProvider(这个类放到后面讲)

2、public abstract int validOps();�
返回当前Channel所支持的操作集合(返回的是一个int值),例如
Netty学习前置知识:Channel详解_第5张图片

3、public abstract boolean isRegistered();�
判断当前Channel是否已经注册到任意一个Selectors

4、public abstract SelectionKey keyFor(Selector sel);�
根据给定的Select获取当前Channel注册时的key,这里的key就是上面的SelectionKey,换句话说就是返回当前Channel支持的操作。

5、public abstract SelectionKey register(Selector sel, int ops, Object att)
注册到指定的Selector上,同时告知Selector当前Channel支持的操作。

6、public abstract SelectableChannel configureBlocking(boolean block)�
设置当前Channel是否阻塞,通常这个会被设置为False。

接下来我们在看下SC的父类,AbstractInterruptibleChannel通过继承AbstractInterruptibleChannel使得SC具有响应中断的能力;同时其所有的子类也拥有响应中断的能力。
小结一下:SelectableChannel是一个可以被选择器选择的信道,该类提供了注册到Selector(选择器的功能)同时由于继承了AbstractInterruptibleChannel使得SelectableChannel以及他的子类拥有了响应中断的能力。

三、结束语

今天学习了Channel相关的知识,同时带出了Selector这个概念,Channel在NIO中还是非常重要的,不同的Channel提供了不同的功能,希望今天的内容对你有所帮助。

你可能感兴趣的:(Netty学习,学习,网络,java)