基于注解注册连接的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

posted on 2024-07-18 16:59  枫沰  阅读(6)  评论(0编辑  收藏  举报

导航