基于注解注册连接的Thrift框架(05)——TTransport
前情提要
之前分析了TProtocol的作用、读写方式以及执行流程,现在再说说最后一个关键组件TTransport。
TTransport
这个类也是一个抽象类
,里面定义了open()、close()、read()、write()等基础的传输相关的方法,对于不同的传输方式有不同的实现。
TTransport中的不同实现
- 同步阻塞IO : TIOStreamTransport、TSocket
- 非阻塞IO:TNonblockingTransport、TNonblockingSocket
- 自动扩展的Buffer:AutoExpandingBufferReadTransport、AutoExpandingBufferWriteTransport
- 支持SASL(Simple Authentication and Security Layer):TSaslServerTransport、TSaslClientTransport、TSaslTransport
- 基于块传输的:TFileTransport
- 支持文件传输的:TSimpleFileTransport
...
TTransport中的包装流和节点流
和Java中的内容一样,TTransport中也分为包装流和节点流。
节点流
是直接连接到数据源或数据目标的流。它们通常用于直接从文件、网络套接字、内存数组等读取或写入数据。节点流是I/O操作的基础,提供了基本的读写功能。
包装流
(也称为处理流或过滤流)是对节点流或其他包装流进行包装的流。它们提供了额外的功能,如缓冲、字符编码转换、数据格式化等。包装流通过装饰器模式(Decorator Pattern)来增强节点流的功能。
节点流:
- AutoExpandingBufferReadTransport
- AutoExpandingBufferWriteTransport
- TMemoryInputTransport
- TByteArrayOutputStream
- TMemoryBuffer
- TNonblockingSocket // 从网络中读取数据
- TSocket // 从网络中读取数据
包装流:
- TFramedTransport
- read:TMemoryInputTransport
- write:TByteArrayOutputStream
- TFastFramedTransport
- read:AutoExpandingBufferReadTransport
- write:AutoExpandingBufferWriteTransport
这两个都用FrameBuffer作为缓冲区读写数据,每次在读写的时候都会先把数据的大小封装成4字节先传输,这在前面TServer的FrameBuffer中分析过。
参考连接
https://www.kancloud.cn/digest/thrift/118989
https://github.com/helloworlde/thrift-java-sample/tree/main/nonblocking-server