Channel的类继承体系
如上所示为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的两种。
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的服务端,去分析它们的类继承体系