Netty Channel管道

时间:2020-01-09 10:36:52  来源:igfitidea点击:

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

ChannelHandler接口具有两个子接口。这些子接口是:

  • ChannelInboundHandler
  • ChannelOutboundHandler

我们可以将ChannelInboundHandler和ChannelOutboundHandler实例都添加到Netty ChannelPipeline中。下图说明了一个" ChannelPipeline",其中添加了" ChannelInboundHandler"和" ChannelOutboundHandler"实例:

当从" SocketChannel"接收到数据时,将其传递到" ChannelPipeline"中的第一个" ChannelInboundHandler"。这个ChannelInboundHandler处理数据,然后将数据传递到ChannelPipeline中的下一个ChannelInboundHandler。

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

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

即使插图将ChannelInboundHandler和ChannelOutboundHandler实例显示为单独的列表,它们实际上位于同一列表(管道)中。因此,如果ChannelInboundHandler决定将某些内容写回到SocketChannel,则数据将通过所有位于ChannelPipeline中的ChannelOutboundHandler实例,而不是通过ChannelInboundHandler写入数据。这在这里说明:

编解码器

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

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

Netty带有针对几种不同协议的编解码器,例如HTTP,WebSocket,SSL / TLS等。为了将这些协议与Netty一起使用,我们必须将相应的协议编解码器ChannelInboundHandler和ChannelOutboundHandler添加到的ChannelPipeline中。我们想与该协议一起使用的" SocketChannel"。 Netty编解码器和协议将在其自己的教程中更详细地介绍。