thrift的TTransport类体系原理及源码详细解析1-类结构和抽象基类

本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩、分帧等,而这些 功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图, 如下:

由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂。但是如 果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能。我们把这个类关 系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直 接从它继承实现它提供或者说定义的接口函数(纯虚函数),这些传输类功能比较单一实现也比较简单 ;第二部分就是TTransport抽象类的默认实现和相应的子类以及加了一层虚拟传输类,这个传输虚拟类 的类继承框架个上一章的协议类虚拟继承框架是相同的实现方案和技术,这样实现可以避免采用虚拟继 承方式,因为虚拟继承效率会比较低一些,虚拟继承需要动态绑定技术(运行时去查找和指定具体的实 现);第三部分就是各种传输类的对象生成工厂类,负责某一种具体传输类对象的生产。

第一节 抽 象基类TTransport

本节介绍的是整个传输层实现的抽象概述,传输层实现的接口都在这个抽象基类 中定义。下面看看传输层都实现了哪些接口?

1.辅助传输层的全局模板函数readAll

在开始分析 传输层的接口以前先看一个辅助模板函数readAll,它的定义和实现如下:

template 

<class Transport_>
uint32_t readAll(Transport_ &trans, uint8_t* buf, uint32_t len) {
  uint32_t have = 0;
  uint32_t get = 0;
  while (have < len) {
    get = trans.read(buf+have, len-have);//通过具体的传输类读取剩余的需要读取的数据
    if (get <= 0) {//处理数据以读完异常
      throw TTransportException(TTransportException::END_OF_FILE, "No more data to read.");
    }
    have += get;//已经读取的字节数
  }

  return have;//返回读到的字节数
}

这个函数现实比较简单,就是通过一个while循环来保证需要读取的字节数能够读完, 如果字节数不够就会抛出异常。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索接口
, 函数
, 抽象
, 传输
, thrift
, 功能
, 抽象虚拟类
, 传输源码
, 数据库抽象层
抽象层
thrift ttransport、抽象基类、c 抽象基类、虚基类和抽象类、虚基类 抽象类,以便于您获取更多的相关知识。

时间: 2025-01-21 17:39:50

thrift的TTransport类体系原理及源码详细解析1-类结构和抽象基类的相关文章

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCom

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCompactProtocol) 这个协议类采用了zigzag 编码,这种编码是基于Variable-length quantity编码提出来 的,因为Variable-length quantity编码对于负数的编码都需要很长的字节数,而zigzag 编 码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了 Varint技术. 所以这个协议类采用zigzag 编码可以节省传输空

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBi

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBinaryProtocol) 这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接 发送原始数据.因为它直接从TVirtualProtocol类继承,而且是一个模板类.它的模板参数 就是一个封装具体传输发送的类,这个类才是真正实现数据传输的.这个类的定义上一节举 例已经出现过了就不在列出来了. 下面我就结合scribe的Log函数执行的具体过程来 分析使用这个协

thrift的TServer类体系原理及源码详解:服务器基类TServer

这一部分主要实现了底层IO通信,还涉及到通信服务器的堵塞.非堵塞.单线程.多线程 等运行模式,所以实现比较复杂.这一部分涉及到的类的关系图如下: 由上面的 类关系图可以看出,这一部分的类关系比较复杂,复杂的不是继承关系,而是相互之间的依 赖关系.因为服务器需要处理很多的任务,也需要处理多个客户端的连接,这就涉及到多线 程编程以及多线程之间通信及并发的情况.这一部分涉及到的并发编程的类容将在后面章节 单独分析,本章主要介绍服务器模型和IO通信的具体细节. 第一节 服务器基类 TServer 所有具

Thrift的代码生成器Compiler原理及源码详细解析 1 类关系图

最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就 用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇 博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为 是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是 生成代码原理都差不多,我主要分析了C++相关代码生成.关于Thrift的使用及原理.代码网上基本上 都

Thrift的TProtocol类体系原理及源码详解:类继承架构分析

这部分相关的类主要实现与协议相关的内容,这里说的协议是指对数据传输格式封装的协 议,实现不同的协议来适合不同场景下的数据传输,因为在不同的场景下不同协议对于数据 传输来说效率有很大的差别.下面是这个部分相关类的类关系图: 由以上类图可以发现所有的协议类都从TProtocol类直接或间接继承,每一个协议 类都有一个对应的生产对象工厂(协议工厂).TProtocol是一个抽象的类,不能直接使用的 ,它有一个直接子类默认实现了所有方法(空实现),如果我们需要定义自己的数据传输协 议可以直接从这个类继承

Thrift的TProtocol类体系原理及源码详解:其他协议类和总结

第六节 其他协议类 主要的协议类基本上已经介绍完毕了,当然如果你有更好的实 现和思路也可以实现自己的协议类,只要按照我前面介绍的类层次结构继承就可以了.除了 前面几节介绍的协议类,Thrift还实现了一些自己内部使用的协议类,例如TDebugProtocol 类,采用开发人员可读的文本协议,有助于调试,又例如TProtocolTap类,它可以使用两种 协议类进行两次协议转换.放一个窃听装置在协议对象,任何读取这个类都是通过一个封闭 的协议对象的,但也反映为写第二个协议对象,还有一个就是用于异常的

Thrift的TProcess类体系原理及源码详解

之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分 析了!会利用到自动代码生成的知识. 这部分是协议层和用户提供的服务实现之间的 纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生 成工具生成的代码.本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍 怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析 其功能,只是介绍它在其中起什么作用.选择的实例是Facebook内部用这个框架实现的一个

Thrift的代码生成器Compiler原理及源码详细解析 3

生成C++语言代码的代码详解 这个功能是由t_cpp_generator类实现(在文件t_cpp_generator.cc定义和实现),直接继承至 t_oop_generator类(这个类是所有面向对象语言生成器类的直接基类,封装了面向对象语言生成器共 有的特征与行为),而t_oop_generator又从t_generator继承(上面已经介绍),下面详细分析这个类 是怎样生成C++语言的代码文件的.这个还有从上面介绍的generate_program函数开始说起,因为这个 函数才是控制整个代

Thrift的代码生成器Compiler原理及源码详细解析 2

2  t_generator类和t_generator_registry类 这个两个类的主要功能就是为生成所有 语言的代码提供基础信息和提供具体代码生成器对象,上面就是调用这个两个类的方法来生成具体语言 的代码生成器对象和执行生成代码的功能函数.下面主要分析两个函数的功能,一个是 t_generator_registry类的get_generator函数,这个是一个静态的函数可以直接通过类调用:另一个 是t_generator类的generate_program函数. (1)t_generato