探究thrift--Thrift C++ 服务器和客户端开发实例--学习笔记

https://blog.csdn.net/feng973/article/details/70160571

http://blog.jobbole.com/107828/

https://blog.csdn.net/feng973/article/details/80434855

上面的博客关于如何使用thrift已经说的很清楚了,下面就具体如何使用以及项目中如何使用进行说明(主要就c++,python来分别说明)

先复习一下

 例子 - thrift接口描述文件
#
# 编写这个文件是为了教会你如何写thrift接口描述文件。
# 第一个你应该掌握的知识点就是.thrift文件
# 支持shell的注释方式,那就是用#符号。
 
/**
* 我们首先来复习一下thrift的常用数据类型,如下所示:
*
* bool 布尔型,1个字节
* byte 有符号整数,1个字节
* i16 有符号16位整型
* i32 有符号32位整型
* i64 有符号64位整型
* double 64位浮点数值
* string 字符串类型
* binary 二进制数据类型(字节数组)
* list 单类型有序列表,允许有重复元素
* set 单类型无需集合,不允许有重复元素
* map<t1,t2> Map型(key:value)
*
* 你发现了么,.thrift文件还支持C语言的多行注释形式。
*/
 
// 不卖关子了,其实我们还支持C语言的单行注释形式呢 ^_^
 
/**
* .thrift文件可以引用其他.thrift文件,这样就可以方便地把一些公共结构和服务囊括进来。
* 在引用其他.thrift文件时,既可以直接引用当前文件夹下的文件,也可以引用其他路径下的
* 文件,但后者需要在thrift编译工具编译时加上-I选项来设定路径。
*
* 如果希望访问被包含的.thrift文件中的内容,则需要使用.thrift文件的文件名作为前缀,
* 比如shared.SharedObject。我们在本例中引用了文件shared.thrift。
*/
include "shared.thrift"
 
/**
* Thrift支持对.thrift文件中的类型设定namespace,这样可以有效避免名字冲突。
* 这种机制在C++中也叫做namespace,而在Java中叫做Package。
* thrift支持针对不同的语言设置不同的namespace,比如下面的例子。
* thrift会在生成不同语言代码时,进行相应的设置。
*/
namespace cpp tutorial
namespace go tutorial
namespace java tutorial
namespace php tutorial
namespace perl tutorial
 
/**
* thrift还可以使用typedef来给类型起别名。
*/
typedef i32 MyInteger
 
/**
* Thrift也支持定义常量。
* 对于结构复杂的常量,支持使用JSON形式来表示。
*/
const i32 MY_NUM = 9853
const map<string,string> MY_MAP = {'hello':'world', 'goodnight':'moon'}
 
/**
* 你还可以定义枚举类型, 其被指定为32位整型。域的值是可以自定义的,而且
* 当不提供域的值时,默认会从1开始编号并递增。
*/
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
 
/**
* 结构体则是一个复杂的数据类型。它由多个域组成,每个域会对应一个整数标识符,
* 每一行的格式为:一个冒号,一个类型,一个域名称和一个(非必填的)默认值。
*
* 每个域都可以设置为optional或required来表示是否为必填域,以便thrift决定是否
* 在数据传输时要包含这个域。不指定时,默认为required。
*/
struct Work {
1: i32 num1 = 0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
 
/**
* 在语法上,异常的定义方式和结构体是完全一样的。在发生问题时,可以抛出异常。
*/
exception InvalidOperation {
1: i32 what,
2: string why
}
 
/**
* 啊哈,我们现在到了最Cool的环节,即定义服务。
* (一个服务可以使用extends来继承另一个服务。)
*/
service Calculator extends shared.SharedService {
 
/**
* 服务中方法的定义非常类似于C语言的语法。它会包括一个返回值,
* 一个参数列表以及一个可以抛出的异常列表(可选)
* 可以提前告诉大家的是,定义参数列表的方法、定义异常列表的方法,
* 和定义结构体的方法都是相似的,可以从下面的例子中看出。
* 除了最后一个方法,其他的方法最后都要有一个逗号,大家可不要忽略这个细节。
*/
 
void ping(),
 
i32 add(1:i32 num1, 2:i32 num2),
 
/**
* 在异常列表前,需要加throws关键字。
*/
i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
 
/**
* 如下的这个方法有一个oneway修饰符,还记得他的作用么
* 这表示这个方法在调用后会立即返回,不会等待远端的回复。
* 要注意的是,oneway只能修饰void返回类型。
* oneway在英语里就是“单向”的意思,还是很形象滴。
*/
oneway void zip()
 
}
 
/**
* 在你使用thrift编译工具编译此文件后,
* 会在当前目录产生一个“gen-<你选择的开发语言>”
* 文件夹,比如你选择的是C++语言,则会产生gen-cpp文件夹,
* 里面放着的便是thrift帮你生成好的代码,
* 代码并不那么晦涩,你可以打开看一看。
*/

总结:

  https://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167669.html

  

来一个实际一点的例子

例子(1)

thrift接口文件student.thrift

struct subjectscore
{
    1: required    string     str_subject,       //科目
    2: required    i32        i_score,           //分数
}

struct student
{
    1: optional list<subjectscore> list_subscores,
    2: required i32 i_uid,                  //学号
    3: required string str_name,            //姓名
    4: optional string str_sex,             //性别
}

struct sturesult
{
    1: required i32 i_uid,                  //学号
    2: required string str_name,            //姓名
    3: optional string str_sex,             //性别
    4: required i32 i_subscore,            //总分
    5: required i32 i_avescore,            //平均分
    6: required string str_maxsub,            //最高分科目
    7: required string str_mixsub,            //最低分科目
}

service StudentServ
{
    sturesult work_score(1: student stu)
}

https://www.cnblogs.com/cqvoip/p/8078975.html

posted @ 2018-07-15 19:04  白伟碧一些小心得  阅读(564)  评论(0编辑  收藏  举报