nio 设计模式(NIO系列5:channel和pipeline的功能有何不同)

channel是NIO中的Socket通道,而pipeline呢从字面理解,也是数据流通的管道。这2个东东,在新人眼里还是不容易理解的。为何有了channel管道了,又搞个pipeline是干啥呢?

其实channel就是通道,维护socket上IO的write、read、connect等相关操作。

另外,Netty中Channel接口中还包含了一个子接口:Unsafe;这个名字看起来有点奇葩吧,这个Unsafe和JDK的Unsafe没半毛钱关系,不要混起来。从字面理解,既然是Unsafe,哪肯定不能给外面的用户用,毕竟不安全的吗,这玩意自己内部用用就好了。它主要用来操作底层的Socket,比如connect、close、read、write。这Socket底层操作,Channel直接操作不就行了,再整个Unsafe出来干嘛?小编认为这是为了软件的解耦,比如在一个公司,一个经理,他会吩咐一个爪牙来跟下面的人沟通,而不是自己直接出面。软件中也是一样,很多功能不是自己胡子眉毛一把抓,尽量把功能分割出来,让不同的模块去完成。

下面,我们来看下Netty中Channel和Unsafe的类图:

nio 设计模式(NIO系列5:channel和pipeline的功能有何不同)(1)

图1 Netty中的channel类图

看起来很复杂,简直让人头爆,是吧?这就对了,软件不是简单地写个hello world就够了,一个设计优秀的软件,不光要考虑当前的功能,还要考虑性能和以后的扩展。

nio 设计模式(NIO系列5:channel和pipeline的功能有何不同)(2)

图2 Netty中的Unsafe类图

Channel讲完了,Channel的爪牙Unsafe也了解了,下面让我们来看看pipeline吧,这玩意到底有啥用?

程序简单说就是数据和对数据的处理,这数据传到了channel,肯定要做处理的。而且这处理方法还多种多样,众口难调呢。比如,他要红烧,他要清蒸,他要碳烤... ...现在,我把这些方法都写到channel里,哪可就麻烦了。一是这个channel功能过于庞杂,难堪了;二是数据处理功能需要灵活添加或删除,这channel再来搞这个功能,恐怕也不方便。于是,爪牙又现身了,把这些任务交给pipeline来干吧。其实pipeline可以称之为pipeline模型,它有pipeline, context, handler组成。这pipeline模型呢,就是用来处理channel中流动的数据的。

nio 设计模式(NIO系列5:channel和pipeline的功能有何不同)(3)

图3 pipeline对数据的处理

最后,小编再简单总结下:

1)channel就是socket通道,用于维护socket上IO的read, write, connect等操作;而这些IO的底层操作呢,在Netty中是通过Unsafe这个不能被外部用户访问的类来完成的。

2)pipeline是一个数据处理模型,用来处理channel中的数据。它采用一种叫责任链的模式来顺序处理流过的数据。

3)一个是底层通道,一个是对通道中流通的数据的处理模型,其他2个根本就是差别很大的东东。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页