本章主要介绍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循环来保证需要读取的字节数能够读完,如果字节数不够就会抛出异常。

2.TTransport类的接口定义

下面用一个表格来分析TTransport抽象类定义的接口行为,如下:

函数名称
函数参数描述
函数作用描述

isOpen

传输层是否打开

peek

测试是否有数据可读或者远程那边是否任然打开。当传输是打开的默认为true,不过具体的实现逻辑需要根据可能的条件。

open

为了通信打开传输层

close

关闭传输层

read

read_virt
uint8_t* buf:读入数据的本地缓存

uint32_t len:需要读取数据的长度
尝试读取指定的字节数到字符串

readAll

readAll_virt
uint8_t* buf:读入数据的本地缓存

uint32_t len:需要读取数据的长度
无论如何都要读取被给长度的数据

readEnd
当读取完成时调用

write

write_virt
uint8_t* buf:写入数据的本地缓存

uint32_t len:需要写入数据的长度
写入字符串到缓存,必须调用flush函数后才真正的写入,下次读取的时候才是可利用的。

writeEnd

写入完成时调用

flush

刷新任何被阻塞或缓存的数据真正被写入

borrow

borrow_virt
uint8_t* buf:借入数据的缓存

uint32_t *len:需要借入数据的长度
尝试返回一个指向len字节的字符串缓存并不是真正的读取消耗它。这个函数主要用于可变长度编码中,因为刚开始不知道具体长度。

consume

consume_virt
uint32_t len:消耗数据的长度
从传输层消耗len字节的数据,这个需要根据borrow函数具体使用的长度来决定。

通常一个传输层的对象要么作为输出要么作为输入,但是通常不能同时作为输入和输出。上面的表格中把所有支持的接口操作都简单的介绍了,后面介绍的具体某一个传输层类的实现都会实现这些接口,只是根据各个子类不同的作用和实现方式有不同而已。特别需要注意的是最后两组函数,这两组函数主要是用于支持可变长度编码的,所以如果传输层对象需要支持可变长度编码必须实现这两组函数。

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

  1. Thrift之TProcess类体系原理及源码详细解析

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细 ...

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

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 又很久没有写博客了,最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是 ...

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

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 2  t_generator类和t_generator_registry类 这个两 ...

  4. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

  5. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  6. 7.Java集合-Arrays类实现原理及源码分析

    Java集合---Arrays类源码解析  转自:http://www.cnblogs.com/ITtangtang/p/3948765.html 一.Arrays.sort()数组排序 Java A ...

  7. JVM CPU Profiler技术原理及源码深度解析

    研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈.Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的JVM Profiler可以从多个方面对程 ...

  8. Thinkphp源码分析系列(七)–控制器基类

    在mvc模式中,c代表的就是控制器,是是应用程序中处理用户交互的部分.通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据.控制器是沟通视图和模型的桥梁,他接受用户请求,并调用模型层去处理用户 ...

  9. 并发编程(十三)—— Java 线程池 实现原理与源码深度解析 之 Executors(三)

    前两篇文章讲了线程池的源码分析,再来看这篇文章就比较简单了, 本文主要讲解 Executors 这个工具类,看看长江创建线程池的几种方法. newFixedThreadPool 生成一个固定大小的线程 ...

随机推荐

  1. 重构后的程序:通过rsync命令抓取日志文件

    push.sh #!/bin/bash function push() { local ip=$ local user=$ local password=$ local path=$ local lo ...

  2. VM虚拟机上 实现CentOS 6.X下部署LVS(DR)+keepalived实现高性能高可用负载均衡

    一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. ...

  3. some words that I always make mistake

    发音相似容易混淆的词汇 alteration  英 [ɔːltə'reɪʃ(ə)n; 'ɒl-]  美 [,ɔltə'reʃən]  n. 修改,改变:变更 alteration /ˌɔːltəˈre ...

  4. POJ2586 Y2K Accounting Bug(贪心)

    题目链接. 题目大意: 题目相当晦涩难懂啊. 一年的12个月,每5个月统计一次,如从1~5,2~6,3~7,...,8~12共统计了8次,已知每次都deficit,问这一年有没有盈利的可能. 一个月s ...

  5. ruby迭代起基础

    “循环”会用在程序中的各种地方.而在循环的地方善用“迭代器”,则是熟练进行Ruby程序设计的重要关键. 不过,迭代器确实有比较抽象的地方,语法也有点怪异(尤其是yield的用法),光是依靠文字说明.看 ...

  6. MARCHdesign_王濤's 星云个人网站 | www.xingyun.cn/MARCHdesign

    MARCHdesign_王濤's 星云个人网站 | www.xingyun.cn/MARCHdesign MARCHdesign_王濤

  7. Cgroup - Linux 内存资源管理

    Hi ,我是 Zorro .这是我的微博地址,我会不定期在这里更新文章,如果你有兴趣,可以来关注我呦. 另外,我的其他联系方式: Email: mini.jerry@gmail.com QQ: 300 ...

  8. spring中@value注解需要注意

    首先,@value需要参数,这里参数可以是两种形式:@Value("#{configProperties['t1.msgname']}")或者@Value("${t1.m ...

  9. jquery cycle pugin

    插件地址: http://jquery.malsup.com/cycle/ <div id="propaganda"><div id="pgdImg&q ...

  10. Linux下几个常用的快捷键,真的很实用

    1. [tab] 键 在linux所有的shell中,[tab]是最常用的也是linux的bash  shell中最棒的功能:它具有命令补全和档案补全的功能.如果不使用[tab]键,那就别说自己懂li ...