内容简介:Channel按照其字面意思非常容易理解,那就是"管道"。自来水通遍千家万户需要架设管道,暖气也需要架设管道,同样,网络通信也需要架设管道,这个管道就是我们的说了这么多,那么到底什么是Channel呢?小编理解,Channel就是连接网络Socket和具有一个Channel通常拥有下面几种属性:
Channel按照其字面意思非常容易理解,那就是"管道"。自来水通遍千家万户需要架设管道,暖气也需要架设管道,同样,网络通信也需要架设管道,这个管道就是我们的 Socket 。我们发现,自来水管道中流通的是自来水,暖气管道中流通的是暖气,那么 Socket 中流通的当属我们的字节流了。
说了这么多,那么到底什么是Channel呢?小编理解,Channel就是连接网络Socket和具有 read, write, connect, and bind 能力的组件的一条通道。
一个Channel通常拥有下面几种属性:
- 1、Channel 本身组件的状态state,比如说是不是处于打开
open状态,是否处于连接connected状态 - 2、Channel 本身将会跟一个
ChannelConfig对象相关联,用于对该Channel进行配置,比如接收缓冲区的大小 - 3、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
每次当处理完Channel操作时,我们应该显式调用其 close() 和 close(ChannelPromise) 对资源进行释放,这将确保所有资源都以正确的方式释放掉~
二、Netty中Channel的类型有哪些?分别有什么作用?
总的来说,不同的协议,不同用途会对应不同类型的 Channel 。下面贴出 Channel 的接口继承图:
- 1、
UnixChannel:此类Channel只暴露一些在Unix类操作系统上面才会有的操作 - 2、
DatagramChannel:一个处理UDP/IP协议的 Channel - 3、
DuplexChannel:一个拥有两个端点并能在每个端点独立关闭的全双工Channel - 4、
Http2StreamChannel:支持HTTP/2协议的 Channel - 5、
SctpChannel:一个处理SCTP/IP协议的Channel - 6、
ServerChannel:一个接收新连接然后创建子Channel的Channel组件,ServerSocketChannel就是一个很好的例子,ServerSocketChannel接受连接,然后创建出SocketChannel
三、Netty中Channel和EventLoopGroup、EventLoop之间的关系
一个 EventLoop 是一条单纯的线程,用于处理注册在其上面的所有I/O事件,也就是说,Channel是需要注册到EventLoop上面去的,而且一个 EventLoop 通常会有多个 Channel 注册,而 EventLoopGroup 则是 EventLoop 的集合。
四、Netty中 EventLoop 等事件线程组件继承图
小编贴出一张简单的继承图,如下所示:
从图中其实可以发现,Netty中线程模型基本上就是从一个叫 EventExecutorGroup , EventExecutorGroup 继承了JDK中的 ScheduledExecutorService 接口,因此在Netty中我们可以利用它做一些定时任务之类的配置。
- 1、
EventExecutorGroup:负责通过其next()方法来创建一系列的EventExecutor,除此之外,也负责管理其创建的EventExecutor生命周期并提供全局关闭方法。 - 2、
EventLoopGroup是一个特殊的EventExecutorGroup,主要用于注册Channel以便后续在事件循环中使用 - 3、
EventExecutor是一个特殊的EventExecutorGroup,它提供一些便捷的方法用来判断一个线程是否在一个EnentLoop中执行 - 4、
MultithreadEventExecutorGroup顾名思义,就是允许任务在多线程中去执行
五、Netty中的 Bootstrap 家族
其实Netty中的 Bootstrap 启动类家族不是很庞大,相当于 工具 类吧! Bootstrap 和 ServerBootstrap 属于上面第二章节说到的 ServerChannel 范畴,总共有3个大类,类图如下:
- 1、
Bootstrap:用于为客户端打开一条通道Channel,通常bind()方法用于创建一个基于UDP的无状态的链接,对于通常的TCP链接,我们则使用其connect()方法创建 - 2、
ServerBootStrap:用于在服务端中打开一个ServerChannel
六、Netty中的 ChannelHandler
ChannelHandler 可以用来处理I/O事件或者用于接收I/O操作,并将指针指向 ChannelPipeline 中的下一个 Handler 。其中 ChannelPipeline 为 ChannelHandler 提供了一个容器。
ChannelInboundHandler 用于为状态( open close connect )的更改设置相应的回调操作,简而言之, ChannelInboundHandler 拦截和处理入站事件, ChannelOutboundHandler 拦截和处理出站事件.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Everything Store
Brad Stone / Little, Brown and Company / 2013-10-22 / USD 28.00
The definitive story of Amazon.com, one of the most successful companies in the world, and of its driven, brilliant founder, Jeff Bezos. Amazon.com started off delivering books through the mail. Bu......一起来看看 《The Everything Store》 这本书的介绍吧!