Channel的类继承体系

157 阅读3分钟

Channel的类继承体系

image.png

如上所示为netty的Channel的继承体系;

然后我用计算机网络的理论知识去解释它;

Channel

首先顶上的Channel表示的通道的概念,这里没有设计到协议的概念;PS:Channel不能理解成连接,因为比如udp它不是面向连接的协议;

  • 一个通道会提供:

1、通道的状态,比如是否已经打开

2、通道的配置参数,比如输入缓冲区的大小

3、读 写 绑定 关闭 等io操作,(这个地方还有connect操作,我理解这个地方是问题的,因为udp是没有连接的概念的,这个设计应该是历史原因netty一开始写是针对tcp协议来的,后面才开始补充udp的)

  • ChannelPipeline 用于处理通道上产生的所有的io事件
  • netty中的io都是异步的,因为你调用完io函数之后,io事件是不是完成是不知道的,但是你将拿到一个对象,那个对象会通知的最后io操作的结果,比如ChannelFuture。
  • 父通道的概念,就是Channel上的Channel parent();函数,父通道是针对那种面向连接的协议来说的,父通道就是监听套接字,如果是udp则返回null
  • netty一开始的应该是专门先写tcp协议的,所以Channel这个地方所提供的函数如果在加上关闭单向传输的功能,其实就完成够tcp使用了。

SctpChannel

表示的sctp/ip的通道

UnixChannel

表示的是Unix域协议的通道

DatagramChannel

表示的使用udp/ip协议的通道

DuplexChannel

字面理解上一种双向通道,但是其实这个命名是不对,因为netty中所涉及的协议都是双工通信的;

它真正表示的是一种特殊的通道;这种通道可以单独关闭某个传输方向的传输。

这个概念没有具体协议的概念;

ServerChannel

ServerChannel也没有设计到具体协议的概念,他表示的一种可以生成子通道的通道

它有三个子类:ServerSocketChannel,SctpServerChannel,ServerDomainSocketChannel,分别对应三种具体的协议;

SocketChannel

他表示的tcp/ip协议的连接,因为tcp可以单独关闭某个传输方向的传输,因此它继承的是DuplexChannel

DomainSocketChannel

Unix的域协议,又分成udp和tcp的两种。

image.png

DomainSocketChannel指的是tcp的这种情况;

它继承DuplexChannel和UnixChannel

因为它可以可以单独关闭某个方向的传输;

DomainDatagramChannel

表示的就是unix域协议的upd的这种情况的通道

ServerDomainSocketChannel

表示的是unix域协议的tcp的这种情况的服务端,它可以产生新的unix域的tcp连接;

因此它同时继承UnixChannel和ServerChannel

ServerSocketChannel

表示的其实就是tcp/ip协议的监听套接字,它继承自ServerChannel,表示他可以产生新的channel,

它不需要在去继承SocketChannel,因为它从Channel继承的函数,已经够他使用了;

SctpServerChannel

表示的是sctp/ip协议的监听套接字

以上是netty的全貌;

接下来我们针对Tcp/ip协议下,使用nio(即select)技术的客户端和使用nio或者epoll的服务端,去分析它们的类继承体系