Netty 有哪些核心组件?

  • Channel

基础的 IO 操作,如绑定、连接、读写等都依赖于底层网络传输所提供的原语,在 Java 的网络编程中,基础核心类是 Socket,而 Netty 的 Channel 提供了一组 API,极大地简化了直接与 Socket 进行操作的复杂性,并且 Channel 是很多类的父类,如 EmbeddedChannel、LocalServerChannel、NioDatagramChannel、NioSctpChannel、NioSocketChannel 等。

  • EventLoop

EventLoop 定义了处理在连接过程中发生的事件的核心抽象。

说白了,EventLoop 的主要作用实际就是负责监听网络事件并调用事件处理器进行相关 IO 操作的处理。

那 Channel 和 EventLoop 直接有啥联系呢?

Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册到其上的 Channel 处理 IO 操作,两者配合参与 IO 操作。

  • ChannelFuture

由于 Netty 是异步非阻塞的,所有的 IO 操作也都为异步的,我们不能立刻得到操作是否执行成功,因此 Netty 提供 ChannelFuture 接口,使用其 addListener() 方法注册一个 ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。

并且,我们还可以通过 ChannelFuture 的 channel() 方法获取关联的Channel,甚至使用 sync() 方法让异步的操作变成同步的。

  • ChannelHandler 和 ChannelPipeline

从应用开发者看来,ChannelHandler 是最重要的组件,其中存放用来处理进站和出站数据的用户逻辑。ChannelHandler 的方法被网络事件触发,可以用于几乎任何类型的操作,如将数据从一种格式转换为另一种格式或处理抛出的异常。如其子接口ChannelInboundHandler,接受进站的事件和数据以便被用户定义的逻辑处理,或者当响应所连接的客户端时刷新ChannelInboundHandler的数据。

ChannelPipeline为ChannelHandler 链提供了一个容器并定义了用于沿着链传播入站和出站事件流的 API。当创建 Channel 时,会自动创建一个附属的 ChannelPipeline。

  • Bootstrap 和 ServerBootstrap

Netty 的引导类应用程序网络层配置提供容器,其涉及将进程绑定到给定端口或连接一个进程到在指定主机上指定端口上运行的另一进程。引导类分为客户端引导 Bootstrap 和服务端引导 ServerBootstrap。

发表评论

后才能评论