Channel按照其字面意思很是容易理解,那就是"管道"。自来水通遍千家万户须要架设管道,暖气也须要架设管道,一样,网络通讯也须要架设管道,这个管道就是咱们的Socket
。咱们发现,自来水管道中流通的是自来水,暖气管道中流通的是暖气,那么Socket
中流通的当属咱们的字节流了。网络
说了这么多,那么到底什么是Channel呢?小编理解,Channel就是链接网络Socket和具备read, write, connect, and bind
能力的组件的一条通道。多线程
一个Channel一般拥有下面几种属性:异步
open
状态,是否处于链接connected
状态ChannelConfig
对象相关联,用于对该Channel
进行配置,好比接收缓冲区的大小
ChannelPipeline
对象相关联,用于处理I/O事件events
Netty 中的 Channel
在Java NIO基础之上封装了更多的操做。在 Netty 中,全部的I/O操做都是异步的。这意味着咱们不能在调用I/O操做以后当即获得I/O操做的结果,所以Netty中提供了一个ChannelFuture
,每次调用异步I/O以后会返回该对象。工具
在 Netty 中,Channel是具备继承结构的,咱们能够经过调用Channel的parent()
方法获取,parent()
方法的返回取决于该Channel是怎么建立出来的。好比一个SocketChannel
由一个ServerSocketChannel
接收,所以当调用SocketChannel
的parent()
方法时将返回ServerSocketChannel
oop
每次当处理完Channel操做时,咱们应该显式调用其close()
和close(ChannelPromise)
对资源进行释放,这将确保全部资源都以正确的方式释放掉~操作系统
总的来讲,不一样的协议,不一样用途会对应不一样类型的Channel
。下面贴出Channel
的接口继承图:线程
UnixChannel
:此类Channel只暴露一些在Unix类操做系统上面才会有的操做DatagramChannel
:一个处理UDP/IP
协议的 ChannelDuplexChannel
:一个拥有两个端点并能在每一个端点独立关闭的全双工ChannelHttp2StreamChannel
:支持HTTP/2
协议的 ChannelSctpChannel
:一个处理SCTP/IP
协议的ChannelServerChannel
:一个接收新链接而后建立子Channel的Channel组件,ServerSocketChannel
就是一个很好的例子,ServerSocketChannel
接受链接,而后建立出SocketChannel
一个EventLoop
是一条单纯的线程,用于处理注册在其上面的全部I/O事件,也就是说,Channel是须要注册到EventLoop上面去的,并且一个EventLoop
一般会有多个Channel
注册,而EventLoopGroup
则是EventLoop
的集合。3d
EventLoop
等事件线程组件继承图小编贴出一张简单的继承图,以下所示:指针
从图中其实能够发现,Netty中线程模型基本上就是从一个叫EventExecutorGroup
,EventExecutorGroup
继承了JDK中的ScheduledExecutorService
接口,所以在Netty中咱们能够利用它作一些定时任务之类的配置。code
EventExecutorGroup
:负责经过其next()
方法来建立一系列的EventExecutor
,除此以外,也负责管理其建立的EventExecutor
生命周期并提供全局关闭方法。EventLoopGroup
是一个特殊的EventExecutorGroup
,主要用于注册Channel
以便后续在事件循环中使用EventExecutor
是一个特殊的EventExecutorGroup
,它提供一些便捷的方法用来判断一个线程是否在一个EnentLoop
中执行MultithreadEventExecutorGroup
顾名思义,就是容许任务在多线程中去执行Bootstrap
家族其实Netty中的Bootstrap
启动类家族不是很庞大,至关于工具类吧!Bootstrap
和ServerBootstrap
属于上面第二章节说到的ServerChannel
范畴,总共有3个大类,类图以下:
Bootstrap
:用于为客户端打开一条通道Channel
,一般bind()
方法用于建立一个基于UDP的无状态的连接,对于一般的TCP连接,咱们则使用其connect()
方法建立ServerBootStrap
:用于在服务端中打开一个ServerChannel
ChannelHandler
ChannelHandler
能够用来处理I/O事件或者用于接收I/O操做,并将指针指向ChannelPipeline
中的下一个Handler
。其中ChannelPipeline
为ChannelHandler
提供了一个容器。
ChannelInboundHandler
用于为状态(open close connect
)的更改设置相应的回调操做,简而言之,ChannelInboundHandler
拦截和处理入站事件,ChannelOutboundHandler
拦截和处理出站事件.