Dubbo-聊聊通信模块设计( 四 )

ByteBufferBackedChannelBufferByteBufferBackedChannelBuffer该类是基于Java NIO的ByteBuffer实现的ChannelBuffer,都是通过操作ByteBuffer的API进行实现,这里我们就不展开了 。
    //NIO ByteBuffer    private final ByteBuffer buffer;    //初始化容量    private final int capacity;    public ByteBufferBackedChannelBuffer(ByteBuffer buffer) {        if (buffer == null) {            throw new NullPointerException("buffer");        }        this.buffer = buffer.slice();        capacity = buffer.remaining();        writerIndex(capacity);    }    public ByteBufferBackedChannelBuffer(ByteBufferBackedChannelBuffer buffer) {        this.buffer = buffer.buffer;        capacity = buffer.capacity;        setIndex(buffer.readerIndex(), buffer.writerIndex());    }ChannelBufferInputStreamChannelBufferInputStream该类实现InputStream输入流的的方法,内部维护了ChannelBuffer、startIndex以及endIndex,该方法内部都是读取ChannelBuffer中的数据 , startIndex和endIndex控制读取数据位置,这样就完成InputStream的扩展实现 。
【Dubbo-聊聊通信模块设计】    //ChannelBuffer    private final ChannelBuffer buffer;    //开始位置    private final int startIndex;    //结束位置    private final int endIndex;    @Override    public int read() throws IOException {        if (!buffer.readable()) {            return -1;        }        return buffer.readByte() & 0xff;    }ChannelBufferOutputStreamChannelBufferOutputStream该类实现OutputStream输出流,内部维护了ChannelBuffer、startIndex , 该方法内部都是写入到ChannelBuffer中,startIndex是标记开始写入位置 。Buffer的整体的设计到此就介绍完成,通过ChannelBufferOutputStream、ChannelBufferInputStream控制数据的输入输出,内部通过ChannelBuffer存储数据,ChannelBuffer可以根据需要进行不同的实现 。
Transport设计Transport在核心API中介绍上层访问都是通过该接口访问的,接下来我们就来探秘下Transport层都做了哪些事情 。
AbstractPeerAbstractPeer该抽象类可以理解为服务器概念,继承了Endpoint、ChannelHandler接口,内部有四个核心的属性,URL代表自身服务的地址,closing、closed表示当前服务器状态,handler就是ChannelHandler , AbstractPeer内部实现了都是委托给ChannelHandler,这是一种典型的装饰器设计模式 。
    //ChannelHandler    private final ChannelHandler handler;    //自身地址    private volatile URL url;    //服务器状态    private volatile boolean closing;    private volatile boolean closed;    public AbstractPeer(URL url, ChannelHandler handler) {        if (url == null) {            throw new IllegalArgumentException("url == null");        }        if (handler == null) {            throw new IllegalArgumentException("handler == null");        }        this.url = url;        this.handler = handler;    }AbstractEndpointAbstractEndpoint继承AbstractPeer,可以理解为端口的抽象 , 内部增加Codec2和connectTimeout两个属性,在AbstractEndpoint在初始化的时候会将这两个字段初始化 。

推荐阅读