本章主要介绍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源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码...
spark-hive_2.11-2.3.0...spark-hive-thriftserver_2.11-2.3.0.jar log4j-2.15.0.jar slf4j-api-1.7.7.jar slf4j-log4j12-1.7.25.jar curator-client-2.4.0.jar curator-framework-2.4.0.jar curator-recipes-2.4.0.jar
Apache Thrift Java实战源码,包含了客户端和服务端源码,客户端和服务端是分开的,如果需要放到一个工程,直接把Client.java文件复制到服务端运行即可。
spark-hive-thriftserver_2.11-2.1.spark-hive-thrift
thrift文件生成工具thrift-0.9.1.exe和thrift-0.9.2.exe压缩包
thrift0.9.1版本的jar包,还有源码,可供大家参考学习使用。
windows下vs2010完美编译thrift,包含lib文件和src源码,thrift版本为thrift-0.11.0
thrift源码+DEMO+简单教程
libthrift-1.0.0.jar,thrift例子,thrift源码 里面有你想要java版的thrift全部文件
cassandra-thrift cassandra-thrift cassandra-thrift cassandra-thrift cassandra-thrift cassandra-thrift
maven-thrift-plugin-0.1.11-sources.jar
thrift-编译工具
thrift,Apache Thrift 0.9.2 版本,解压后直接直接安装,可伸缩的跨语言服务开发框架,命令: 解压命令:tar -zxf thrift-0.9.2.tar.gz 安装命令:./configure --with-lua=no && make && make install 查看版本:...
stm32f4-thrift-源码.rar
Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨...
Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝...
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...
thrift 0.9.3 for vs2013/vs2015 直接打开 thrift-master-0.9.3\lib\cppVS2013\thrift.sln thrift-master-0.9.3\lib\cppVS2015\thrift.sln 编译即可
thrift-0.9.1.exe和thrift-0.9.2.exe 含使用说明
thrift-generator 是通过 Java 的接口生成 thrift 文件的工具。例子:public interface ICommonUserService { public User login(int id, String name); public User getUserById(long id); ...