zoukankan      html  css  js  c++  java
  • 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的,本身还是只是封装
  • 相关阅读:
    mybatis源码追踪2——将结果集映射为map
    Mybatis的cache
    mybatis拦截器
    mybatis中单个参数的引用
    mybatis源码追踪1——Mapper方法用法解析
    win8 下 intellij idea 13 中文输入覆盖的问题
    firebug中html显示为灰色的原因总结
    extjs4.0以上添加多行工具栏的方法
    去除eclipse的validating
    An interview question from MicroStrategy
  • 原文地址:https://www.cnblogs.com/zby9527/p/14205696.html
Copyright © 2011-2022 走看看