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的,本身还是只是封装
posted @
2020-12-29 11:39
java拌饭
阅读(
611)
评论()
编辑
收藏
举报