netty的继续学习一(相关概念)
前言
以前写过一个关于netty基本的一个demo,但是由于本人懒惰,一直不进行更新,最近可能是心情有点浮躁,写点东西来进行缓解一下浮躁的心情,就接着开始写关于netty的一些东西,希望我能坚持下来
netty的核心组件
从上一篇的demo中可以看出来,netty框架中主要有以下几个组件:
- Bootstrap & ServerBootstrap
- Channel
- ChannelFuture
- EventLoop & EventLoopGroup
- ChannelHandler
- ChannelPipeline
下面我们就开始针对一个一个的组件进行分析,看看他都是干什么用的,都有什么功能
Bootstrap & ServerBootstrap
我们先来进行分析Bootstrap(客户端)和ServerBootstrap(服务端) 这两个组件,通过源码我们可以发现这两个组件都是继承于AbstractBootstrap这个抽象类,从而我们就可以证明这两个类中会有很多相同的方法,他们之间的相同点要大于他们之间不同点。那这两个组件到底是干什么的,我偏向于认为这两个组件就是netty的一个启动类,类似于springboot项目中的main方法,BootStrap用于客户端的启动,里面的connect方法的用来进行连接服务端的操作,ServerBootStrap用于服务端的启动,里面的bind方法用来进行绑定端口号。
channel
这个音译过来是代表着一个通道的意思,在netty中是是代表着网络的抽象类,主要进行网络的一些相关的操作功能
EventLoop & EventLoopGroup
Netty是基于事件驱动模型的,使用的不同的事件来通知我们进行不同的操作。Channel为netty网络操作抽象类,EventLoop负责处理注册其上的channel处理I/O操作。
这个EventLoopGroup更像是一个线程池的东西,里面进行一些操作,来进行处理一些runnable相关的接口信息
ChannelFuture
netty作为一个异步非阻塞的框架,所有I/O操作均为异步进行执行,因此我们不能得知一些操作是否执行完毕,因此它提供了ChannelFuture接口 里面有addListener方法,里面进行监听操作执行之后的结果信息。这样我们就可以进行监听结果的成功或者失败,从而进行一些自己的操作。
ChannelHandler
channelHandler,从字面意思看这个是属于一个处理,实际上它确实是一个处理器,是我们使用netty的时候最常用的组件,用来进行处理netty的各种事件通知,比如说:连接,接受数据,异常,断开连接等。
ChannelHandler有两个比较核心的子类:ChannelOutboundHandler和ChannelInboundHandler。
ChannelInboundHandler:用于处理入站事件,即网络到应用程序流动的事件,当netty接收到一些新的数据,状态更改或者用户触发一些事件的时,会进行调用里面的一些方法。
ChannelOutboundHandler:用于处理出站事件,即应用程序向网络流出的事件,当netty准备发送数据或者其他出站操作的时候,会进行调用里面的一些方法。
ChannelPipeline
ChannelPipeline为ChannelHandler的链,是一个处理网络的通道,它的主要职责:
拦截和处理I/O事件:它会按照ChannelPipeline中的ChannelHandler的顺序依次传递和处理这些事件。
管理和组织channelHandler:ChannelPipeline是一个ChannelHandler的容器,负责添加,删除和管理这些容器。
提供上下文的信息:每个ChannelHandler都有一个与之对应的ChannelHandlerContext,这个上下文中提供了很多有用的信息。