vlambda博客
学习文章列表

《Netty》5.接口的功能介绍

在中,我们编写了Client端的代码,接下来我们将学习到Server端与Client端启动类中各个接口的功能。

Channel接口

Channel是对Socket的抽象,与传统IO中Socket操作相比,Channel降低了直接使用套接字的复杂性,并且提供了很多不同的实现,供大家在不同的场景选择对应的类;
例如:
  • EmbeddedChannel

  • LocalServerChannel

  • NioDatagramChannel

  • NioSctpChannel

  • NioSocketChannel


EventLoop接口

作用:控制流,多线程,并发性。
EventLoop定义了Netty处理连接生命周期中发生的事件的核心抽象,下面介绍Channels、EventLoops、Threads和EventLoopGroups之间的关系。
  1. 一个EventLoopGroup包含一个或多个Eventloop。
  2. 一个EventLoop对应一个线程。
  3. 由EventLoop处理的所有I/O事件。
  4. Channel的生命周期是由单个EventLoop注册开始的。
  5. 一个EventLoop可以分配给一个或多个channel。

示意图

ChannelFuture

Netty中的IO操作都是异步的,每个操作可能不会立即返回结果,所以需要一种方法在稍后能确定结果,而ChannelFuture为此出现了,它的addListener() 方法在操作完成时不管成功与否都会通知ChannelFutureListener。
注意:假如添加了多个ChannelFutureListener,它们将会按照添加顺序调用。

ChannelHandler

之前介绍到它是用来处理入站和出站的业务逻辑,应用程序中会有一个或多个ChannelHandlers。
Netty以适配器模式的方式提供了许多默认的ChannelHandler,其目的是简化应用程序处理逻辑的开发,而我们只需扩展对应的方法就行;
比如:
  1. ChannelHandlerAdapter
  2. ChannelInboundHandlerAdapter
  3. ChannelOutboundHandlerAdapter
  4. ChannelDuplexHandlerAdapter

大家是否还记得在中我们用的SimpleChannelInboundHandler,EchoClient的EchoClientHandler用来接收解码的消息并将业务逻辑应用到数据中。要创建这样一个ChannelHandler,只需扩展基类SimpleChannelInboundHandler<T>,其中<T>是想要处理的消息的Java类型。在这个Handler中,将重写基类的一个或多个方法,并获得对ChannelHandlerContext的引用,该引用将作为输入参数传递给所有处理程序方法。

ChannelPipeline

ChannelPipeline为ChannelHandlers链提供了一个容器,用于沿着链传播入站和出站事件流。当一个Channel被创建时,它被自动分配它自己的ChannelPipeline。
  1. ChannelInitializer实现是向ServerBootstrap注册的。
  2. 当ChannelInitializer. initchannel()被调用时,自定义ChannelHandlers的将分配到ChannelPipeline中。
  3. ChannelInitializer从ChannelPipeline中删除自己。

当有新的事件发生时,会按照ChannelHandler在ChannelPipeline添加的顺序依次执行处理逻辑。

数据入站和出站流经ChannelPipeline示意图


从客户端的角度来看,如果事件是从客户端到服务端,称为出站事件,反之称为入站事件。