Java的Channel对比Netty的Channel

java中的Channel抽象

三层抽象

  • 第一层:Channel层只是抽象了channel最顶层的两个方法
  • 第二层:可选的Channel抽象,只抽象了Channel跟Selector的交互
  • 第三层:直接的具体抽象,以Socket为例,SocketChannel是用户读写数据的,ServerSocketChannel是用于创建SocketChannel,所以两者其实看起来没有啥可公共抽象的

Netty中的Channel抽象

四层抽象

  • 第一层:channel层抽象抽象了所有Channel的公共行为,不管是客户端服务端。包含的是Netty本身设计的一些抽象,比如Channel会有id,每个Channel都会绑定一个EventLoop、一个ChannelPipeline、一个ChannelConfig,底层使用Unsafe进行实际传输。
  • 第二层:NIO抽象对NIO层的行为进行抽象,比如NIO都会有一个SelectableChannel进行实际处理,都会得到一个SelectionKey
  • 第三层:读写层抽象,这里已经限定在了NIO中,以Socket为例:客户端读写的是ByteBuffer,服务端用于接受链接,可以抽象成读到的是Channel,因此分为了实际数据的读写的Channel和读取消息的服务端Channel,比如在NIO的服务端,读取的消息就是创建的Channel。
  • 第四层:具体实现消息读写、连接、绑定等

总结

  • 从宏观上理解,Netty的Channel更具业务能力,我们在很多地方可以直接传递Channel,就可以直接得到关联的组件。同时,他的分层也比较适合层层递进,从全局Channel到NIO层抽象,再到读写层,再到具体应用,每一层的抽象极致复用到下一层。
  • Java本身的抽象,在具体实现层承载了几乎全部的实际Channel能力,没有在客户端服务端上进行抽象。
  • Netty的读写层抽象得益于一个巧妙的想法:服务端读取的是Channel,客户端读取的是ByteBuffer,可以抽象层出都是读取消息
  • Netty的Channel是依赖与Java的Channel的,本身还是只是封装
原文地址:https://www.cnblogs.com/zby9527/p/14205696.html