Netty 基本组件小结--Channel、EventLoop、Bootstrap等

栏目: 后端 · 发布时间: 6年前

内容简介: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、EventLoop、Bootstrap等

Netty 中的 Channel 在Java NIO基础之上封装了更多的操作。在 Netty 中,所有的I/O操作都是异步的。这意味着我们不能在调用I/O操作之后立即得到I/O操作的结果,因此Netty中提供了一个 ChannelFuture ,每次调用异步I/O之后会返回该对象。

在 Netty 中,Channel是具有继承结构的,我们可以通过调用Channel的 parent() 方法获取, parent() 方法的返回取决于该Channel是怎么创建出来的。比如一个 SocketChannel 由一个 ServerSocketChannel 接收,因此当调用 SocketChannelparent() 方法时将返回 ServerSocketChannel

每次当处理完Channel操作时,我们应该显式调用其 close()close(ChannelPromise) 对资源进行释放,这将确保所有资源都以正确的方式释放掉~

二、Netty中Channel的类型有哪些?分别有什么作用?

总的来说,不同的协议,不同用途会对应不同类型的 Channel 。下面贴出 Channel 的接口继承图:

Netty 基本组件小结--Channel、EventLoop、Bootstrap等
  • 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之间的关系

Netty 基本组件小结--Channel、EventLoop、Bootstrap等

一个 EventLoop 是一条单纯的线程,用于处理注册在其上面的所有I/O事件,也就是说,Channel是需要注册到EventLoop上面去的,而且一个 EventLoop 通常会有多个 Channel 注册,而 EventLoopGroup 则是 EventLoop 的集合。

四、Netty中 EventLoop 等事件线程组件继承图

小编贴出一张简单的继承图,如下所示:

Netty 基本组件小结--Channel、EventLoop、Bootstrap等

从图中其实可以发现,Netty中线程模型基本上就是从一个叫 EventExecutorGroupEventExecutorGroup 继承了JDK中的 ScheduledExecutorService 接口,因此在Netty中我们可以利用它做一些定时任务之类的配置。

  • 1、 EventExecutorGroup :负责通过其 next() 方法来创建一系列的 EventExecutor ,除此之外,也负责管理其创建的 EventExecutor 生命周期并提供全局关闭方法。
  • 2、 EventLoopGroup 是一个特殊的 EventExecutorGroup ,主要用于注册 Channel 以便后续在事件循环中使用
  • 3、 EventExecutor 是一个特殊的 EventExecutorGroup ,它提供一些便捷的方法用来判断一个线程是否在一个 EnentLoop 中执行
  • 4、 MultithreadEventExecutorGroup 顾名思义,就是允许任务在多线程中去执行

五、Netty中的 Bootstrap 家族

其实Netty中的 Bootstrap 启动类家族不是很庞大,相当于 工具 类吧! BootstrapServerBootstrap 属于上面第二章节说到的 ServerChannel 范畴,总共有3个大类,类图如下:

Netty 基本组件小结--Channel、EventLoop、Bootstrap等
  • 1、 Bootstrap :用于为客户端打开一条通道 Channel ,通常 bind() 方法用于创建一个基于UDP的无状态的链接,对于通常的TCP链接,我们则使用其 connect() 方法创建
  • 2、 ServerBootStrap :用于在服务端中打开一个 ServerChannel

六、Netty中的 ChannelHandler

Netty 基本组件小结--Channel、EventLoop、Bootstrap等

ChannelHandler 可以用来处理I/O事件或者用于接收I/O操作,并将指针指向 ChannelPipeline 中的下一个 Handler 。其中 ChannelPipelineChannelHandler 提供了一个容器。

ChannelInboundHandler 用于为状态( open close connect )的更改设置相应的回调操作,简而言之, ChannelInboundHandler 拦截和处理入站事件, ChannelOutboundHandler 拦截和处理出站事件.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux内核设计的艺术

Linux内核设计的艺术

新设计团队 / 机械工业出版社华章公司 / 2011-6-20 / 79.00元

关于Linux内核的书已经不计其数,但这本书却是独树一帜的,它的内容代表着Linux内核研究成果的世界顶尖级水平,它在世界范围内首次提出并阐述了操作系统设计的核心指导思想——主奴机制,这是所有操作系统研究者的一笔宝贵财富。本书可能也代表着同类图书的顶尖水平,是一本真正能引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系......一起来看看 《Linux内核设计的艺术》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具