内容简介: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
拦截和处理出站事件.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
博客秘诀:超人气博客是怎样炼成的
Darren Rowse、Chris Garrett / 向怡宁 / 人民邮电出版社 / 201005 / 39.00元
作为Web 2.0的新生事物的博客,如今已蓬勃发展,呈燎原之势,业已成为许多人的一种生活方式。中国从事博客写作的人数已达千万级,各类博客网站不可胜数。 然而,为什么有的博客人气鼎盛,拥趸众多,有的博客却门前冷落,少人问津呢?究竟应该怎样写好自己的博客,才能让它吸引更多访客的关注呢?博客网站还能为我做什么呢? 本书的两位作者长期主持知名博客站点ProBlogger.net,指导了成千上万......一起来看看 《博客秘诀:超人气博客是怎样炼成的》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
XML、JSON 在线转换
在线XML、JSON转换工具