netty之Channel、pipeline、ChannelHa
本文来讲述下netty中Channel、pipeline、ChannelHandler三者的基本关系
channel就是表示服务端与客户端的一条连接通道,channel可读写数据。其中NioServerSocketChannel与NioSocketChannel,就是对应nio的ServerSocketChannel与SocketChannel,相比nio的channel功能会更多。
pipeline,管道。每个channel都会有对应的一个pipeline对象,在channel创建的时候就会创建对应的pipeline,可以理解为channel读写的数据都需要流过pipeline对象,且pipeline上会有一个个的ChannelHandler,这样每个ChannelHandler就有机会处理这些数据了,且每个ChannelHandler处理完数据,可以将数据转发给下一个ChannelHandler。在pipeline创建的时候,也会创建两个ChannelHandler一个是Head,一个是Tail。
ChannelHandler,channel处理器,挂在pipeline上的,用于处理channel的读写数据。且ChannelHandler分为两种类型,一种是ChannelInboundHandler,处理入站数据,也就是从channel读取到的数据。另一种是ChannelOutboundHandler,处理出站数据,也就是写入channel的数据。当然了,还有双向的ChannelHandler,既可以处理读取数据,又可以处理写入数据,这种称为ChannelDuplexHandler。channel上读取的数据经过pipeline流入入站处理器,然后应用程序往channel写入的数据先经过出站处理器,最后再写入channel。如图所示

上面说了生成pipeline时,默认会生成两个Handler,一个是Head,pipeline的第一个Handler;另一个是Tail,pipeline的最后一个Handler。应用程序添加的Handler始终排在head和tail的中间。其中Head是双向的Handler,即处理输入,又处理输出。而Tail只处理输入的。
head开始读取pipeline流入的数据,且转发给下一个入站处理器,最终流出pipeline的数据也会经过head的处理,往channel写入数据。tail只是读取数据,主要是为了释放内存,这个和netty的引用计数有关,后续再说。