文章目录
- 概念
- Channel Pipeline实现原理分析
- 详解 Inbound事件和Outbound事件
- 演示Code
概念
Netty中的Channel
和Pipeline
是其核心概念,它们在构建高性能网络应用程序时起着重要作用。
Channel:
在Netty中,Channel
表示一个开放的连接,可以执行读取/写入操作。Channel
可以是网络套接字,文件,或者任何可以进行I/O操作的实体。每个Channel
都与一个EventLoop
相关联,它负责处理所有I/O事件和任务。Channel
提供了异步的I/O操作,可以通过注册关注的事件来触发。
Pipeline:
Pipeline
是一个处理I/O事件或执行业务逻辑的组件链。它由一系列ChannelHandler
组成,每个ChannelHandler
都负责处理特定类型的事件。当数据通过Channel
时,它会在Pipeline
中流动,每个ChannelHandler
都有机会处理它。
内部机制:
-
Channel:
Channel
内部包含一个Pipeline
。- 当一个
Channel
被创建时,会创建一个新的Pipeline
实例。 Channel
的生命周期与Pipeline
密切相关,一个Channel
的事件将在其关联的Pipeline
中被处理。
-
Pipeline:
Pipeline
是由一系列ChannelHandler
按顺序组成的。- 数据在
Pipeline
中流动,每个ChannelHandler
按照添加的顺序逐个处理数据。 - 每个
ChannelHandler
都可以拦截并处理入站(Inbound)或出站(Outbound)事件,例如数据读取、数据写入等。
-
事件传播:
- 当事件通过
Channel
时,它将被传播到关联的Pipeline
。 - 事件首先通过
ChannelPipeline
中的第一个ChannelHandler
,然后依次传播到链中的下一个ChannelHandler
。 ChannelHandler
可以拦截并处理特定类型的事件,也可以将事件传递给下一个ChannelHandler
。
- 当事件通过
-
ChannelHandlerContext:
ChannelHandlerContext
是ChannelHandler
与Pipeline
以及Channel
之间的桥梁。- 每个
ChannelHandler
都有一个关联的ChannelHandlerContext
,它提供了访问Pipeline
和Channel
的方法。
Netty中的Channel
代表一个开放的连接,而Pipeline
是一个处理I/O事件的链。
Channel
的生命周期与Pipeline
紧密相连,数据通过Pipeline
中的ChannelHandler
逐个处理。
事件传播通过ChannelHandlerContext
实现,使得每个ChannelHandler
都可以对事件进行处理或传递给下一个处理器。
Channel
概念与java.nio.channel
概念一致,用以连接IO设备(socket、文件等)的纽带。
Netty的Channel可以这么分类
Channel的IO类型主要有两种:
- 非阻塞IO(NIO)
- 阻塞IO(OIO);
数据传输类型有两种:
- 按事件消息传递(Message)
- 按字节传递(Byte)
适用方类型也有两种:
- 服务器(ServerSocket)
- 客户端(Socket)
还有一些根据传输协议而制定的的Channel,如:
- TCP
- UDTP
- SCTP等
Netty按照类型逐层设计相应的类。最底层的为抽象类AbstractChannel
,再以此根据IO类型、数据传输类型、适用方类型实现。类图可以一目了然,如上图
Channel Pipeline实现原理分析
首先,想象一下Channel就像是通道,它提供了一些操作方法,比如读(read)和写(write)。但它并不是直接执行这些操作,而是通过一个叫做Pipeline的东西来实现的。
现在,Pipeline可以看作是一条连接了很多小工具的长链。每个小工具被称为Handler,它们负责处理网络通信中的不同任务,比如数据的编码、解码和其他处理。
这个链的结构可以看作是一个双向链表,每个节点是一个处理器。内部代码实现的流程是从头(Head)到尾(Tail)的顺序,对于传入数据,或者从尾(Tail)到头(Head)的顺序,对于传出数据。
详解 Inbound事件和Outbound事件
Inbound事件和Outbound事件是两种类型的事件,根据触发事件的源头进行区分
https://stackoverflow.com/questions/22354135/in-netty4-why-read-and-write-both-in-outboundhandler
Inbound指网络数据从外部进入Netty过程,也就是数据的输入。当Nettyt收到外部的数据,就会调用Inbound相关方法来处理数据。例如,当Netty收到一个新的连接请求时,就会调用Inbound#channelActive
方法来处理这个连接请求。另外,当Netty接收到一个数据包时,就会调用Inbound#channelRead
方法来处理这个数据包。
outbound指网络数据从Netty出到外部的过程,也就是数据的输出。当Netty 要向外部发送数据时,就会调用Outbound 相关方法来处理数据。例如,当Netty 要向外部发送一个数据包时,就会调用Outbound#write
法来将数据包写入输出缓冲区。另外,当Netty需要关闭一个连接时,就会调用outboundc#lose
方法来关闭连接。
演示Code
请移步 [Netty Review - 探索Pipeline的Inbound和Outbound](https://blog.csdn.net/yangshangwei/article/details/134704751)