本人刚刚接触Netty,所以如果有不正确的地方,希望大家积极指出并一起讨论~~

Channel----Socket

EventLoop----用于控制流、多线程处理、并发

ChannelFuture----异步通知

1.Channel、EventLoop、ChannelFuture

1.1 Channel接口

Netty中的Channel所提供的API,大大降低了使用Socket的复杂性。Channel是一个Java NIO的一个基本构造。可简单的理解为把Channel看作入站或者出站的载体。因此,它也可以被打开或者关闭

1.2 EventLoop接口

EventLoop是Netty中的核心组件,用于处理连接的生命周期中所发生的事件

Channel、EventLoop、EventLoopGroup之间的关系:

  • 一个EventLoopGroup包含一个或者多个EventLoop
  • 一个EventLoop在其生命周期中国只和一个线程进行绑定
  • 所有的EventLoop处理的IO事件都在其自身所绑定的线程中进行处理
  • 一个Channel在其生命周期中只注册于一个EventLoop
  • 一个EventLoop可能包含一个或多个Channel

1.3 ChannelFuture接口

Netty中,所有的IO操作都是异步的,因此我们需要一个在之后的某一事件能够确定其结果的方法---ChannelFuture接口,其中的 addListener()方法注册了一个ChannelFutureListener,已便在某个操作完成时得到通知

2.Channelhandler、ChannelPipeline

用于管理数据流和执行应用程序的处理逻辑

2.1ChannelHandler接口

用于处理入站和出站数据的应用程序逻辑的容器。

ChannelInboundHandler:接收入站事件和数据,接收的数据会被应用程序的业务逻辑所处理。若要给客户端发送响应时,也可以从ChannelInboundHandler中冲刷数据。

2.2 ChannelPipeline接口

       ChannelPipeline为Channelhandler链提供了容器,还包括用户在ChannelHandler链上传播入站和出站事件的API。一个Channel被创建时,会被自动的分配到专属的ChannelPipeline。

ChannelHandler安装到ChannelPipeline过程:

  • 将一个ChannelInitializer注册到ServerBootStrap中
  • 若ChannelInitializer的initChannel()方法被调用时,会在ChannelPipeline中安装一个自定义的ChannelHandler
  • ChannelInitializer将其自身从ChannelPipline中移除

Netty可以区分ChannelInboundHandler和ChannelOutboundHandler,并确保数据只会在具有相同定向类型的两个Channelhandler中传递

       当ChannelHandler被添加ChannelPipeline中时,他会被分配一个ChannelHandlerContext,代表ChannelHandler和ChannelPipeline之间的绑定,通常用于写出站数据/获取底层的Channel。

2.3抽象类SimpleChannelInboundHandler

        程序将会利用一个ChannelHandler来接收解码消息,并对其应用业务逻辑。我们可以通过扩展基类SimpleChannelInboundHandler,通过重写方法并且获取到一个ChannelHandlerContext的引用,这个引用将作为输入参数传递给ChannelHandler的所有方法。

更多推荐

Netty--菜鸟入门--Netty组件