Netty 核心: ChannelPipeline

Netty ChannelPipeline是Netty中非常核心的概念。每个SocketChannel包含一个ChannelPipeline。 ChannelPipeline包含ChannelHandler实例的列表。当数据进入和写出SocketChannel时,将调用这些ChannelHandler实例。


ChannelHandler接口具有两个子接口:

ChannelInboundHandler

ChannelOutboundHandler


你可以将ChannelInboundHandler和ChannelOutboundHandler实例都添加到ChannelPipeline。下图说明了添加了ChannelInboundHandler和ChannelOutboundHandler实例的ChannelPipeline:

channelpipeline-1.png


从SocketChannel接收到数据后,该数据将传递到ChannelPipeline中的第一个ChannelInboundHandler。此ChannelInboundHandler处理数据,然后将数据传递到ChannelPipeline中的下一个ChannelInboundHandler。

实际上,ChannelInboundHandler可以转换接收到的数据,然后再将其传递到管道中的下一个处理程序。例如,原始字节可以转换为HTTP对象或其他一些对象。然后,管道中的下一个处理程序将看到HTTP对象,而不是原始数据。

当将数据写回到SocketChannel时,它以相同的方式发生。数据从ChannelOutboundHandler传递到ChannelPipeline中的ChannelOutboundHandler,直到到达SocketChannel。 ChannelOutboundHandler实例还可以转换流程中的数据。

尽管该图将ChannelInboundHandler和ChannelOutboundHandler实例显示为单独的列表,但它们实际上位于同一列表(管道)中。因此,如果ChannelInboundHandler决定将某些内容写回SocketChannel,则数据将通过比ChannelInboundHandler写入数据更早的ChannelPipeline中位于所有ChannelOutboundHandler实例:

channelpipeline-2.png


Codecs

Netty具有编解码器(编码器+解码器)的概念。 Netty编解码器将字节转换为消息对象(Java对象),或将消息对象转换为字节。例如,编解码器可能会将传入的HTTP请求的原始字节转换为HTTP对象,或者将HTTP响应对象转换回原始字节。

Netty编解码器对象实际上只是一个(或两个)ChannelHandler实现。编解码器通常由将请求字节转换为对象的ChannelInboundHandler实现和将响应对象转换为字节的ChannelOutboundHandler组成。

Netty附了几种不同协议的编解码器,例如HTTP,WebSocket,SSL / TLS等。为了将这些协议与Netty一起使用,你必须将相应的协议编解码器ChannelInboundHandler和ChannelOutboundHandler添加到要使用的SocketChannel的ChannelPipeline中。


 

展开阅读全文