thrift一个例子 - xiaoshe的专栏 - 博客频道 -

系统 1887 0

thrift一个例子 - xiaoshe的专栏 - 博客频道 - CSDN.NET

thrift一个例子

分类: thrift 3164人阅读 评论 (2) 收藏 举报

我用的是c++,所以我举一个c++的例子,简单说一下thrift的使用入门。

例子描述是这样的:我们将学生信息(学号,姓名,性别,年龄)由客户端发送到服务端。

实现这个例子,我们大致要做以下几部分事情:

(1)书写.thrift文件

(2)生成cpp文件

(3)编写客户端

(4)编译cpp文件并执行

 

(1)书写.thrift文件

学生信息是有结构的,所以我们使用thrift的struct即可,为了达到通信的目的,我们必须使用service。

所以最后书写成的student.thrift文件内容如下:

struct Student{
 1: i32 sno,
 2: string sname,
 3: bool ssex,
 4: i16 sage,
}
service Serv{
 void put(1: Student s),
}

(2)生成cpp文件

生成cpp文件很简单,只需要一个thrift命令即可:

/home/xiaoshe/opt/bin/thrift -r --gen cpp student.thrift

--gen 后指定生成的语言,生成的cpp存储在目录gen-cpp下

命令执行后,将会在 ./gen-cpp/ 目录下生成如下文件:

Serv.cpp

Serv .h

Serv _server.skeleton.cpp

student _constants.cpp

student _constants.h

student _types.cpp

student _types.h

注意文件的大小写:

Serv开头的文件是由service生成的,这个关键字很重要,下面还会见到以它开头的类。

student是根据student.thrift文件的名生成的。

这些文件可以进行编译,生成最初的服务端。

 

(3)编写客户端

使用 thrift 命令后,我们并没有得到我们想要的客户端 client 源代码,因此客户端程序要由我们自己编写实现。然而很幸运,我们可以使用下面的代码段来编写我们 client 程序:

 

  1. #include "Serv.h"  // 替换成你的.h   
  2. #include <transport/TSocket.h>   
  3. #include <transport/TBufferTransports.h>   
  4. #include <protocol/TBinaryProtocol.h>   
  5.   
  6. using   namespace  apache::thrift;  
  7. using   namespace  apache::thrift::protocol;  
  8. using   namespace  apache::thrift::transport;  
  9.   
  10. using  boost::shared_ptr;  
  11.   
  12. int  main( int  argc,  char  **argv) {  
  13.     boost::shared_ptr<TSocket> socket( new  TSocket( "localhost" , 9090));  
  14.     boost::shared_ptr<TTransport> transport( new  TBufferedTransport(socket));  
  15.     boost::shared_ptr<TProtocol> protocol( new  TBinaryProtocol(transport));  
  16.   
  17.     transport->open();  
  18.   
  19.      // 我们的代码写在这里   
  20.   
  21.     transport->close();  
  22.   
  23.      return  0;  
  24. }  

 

保存成文件client.cpp

(4)编译cpp文件并执行

编译服务端:g++ -g -I/home/xiaoshe/opt/include/thrift -L/home/xiaoshe/opt/lib/ -lthrift Serv.cpp student_types.cpp student_constants.cpp Serv_server.skeleton.cpp -o server

 

编译客户端:g++ -g -I/home/xiaoshe/opt/include/thrift -L/home/xiaoshe/opt/lib/ -lthrift -lm -pthread -lz -lrt -lssl Serv.cpp student_types.cpp student_constants.cpp client.cpp -o client

运行服务端:./server

运行客户端:./client

 

(5)传输我们的数据Student信息

到此客户端已经连上了服务端,但服务端只有这样的响应(No more data to read),因为二者之间还没有数据交互。

我们把客户端当做发送端,修改client.cpp向服务端发送数据。

在“ // 我们的代码写在这里”

写下我们的代码:

// 先创建一个Student类型的变量,Student是我们在student.thrift中定义过的

 Student s;
 s.sno = 123;
 s.sname = "xiaoshe";
 s.ssex = 1;
 s.sage = 30;

// 再定义一个对象client,又是以"Serv"开头的类

 ServClient client(protocol);

// 最后调用put函数向服务端传输数据, put是student.thrift采用service定义的成员函数。

// 调用put后,服务端也调用相应的put()
 client.put(s);

 

 

服务端负责接收数据,也做相应修改:

在类ServHandler()的put()中:

printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage);

 

最后编译,运行服务端,启动客户端后,服务端收到消息,显示结果为:

put
sno=123 sname=xiaoshe ssex=1 sage=30

至此,客户端已能向服务端发送数据了。

thrift一个例子 - xiaoshe的专栏 - 博客频道 - CSDN.NET


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论