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在初始化的时候会将这两个字段初始化 。
推荐阅读
- 驱动开发:内核封装WSK网络通信接口
- 二 Linux进程间通信
- 一 Linux进程间通信
- VS Code For Web 深入浅出 -- 进程间通信篇
- 聊聊Linux中CPU上下文切换
- 聊聊Vim的工作原理
- 驱动开发:通过Async反向与内核通信
- 今天聊聊跑步配速那些事 跑步机配速对照表
- 51单片机下实现软件模拟IIC通信
- 驱动通信:通过PIPE管道与内核层通信