Thrift编译器会根据选择的目标语言为server产生服务接口代码,为client产生stubs,参数可以是基本类型和结构体。

代码框架用的Thrift,为了了解结构,学习写了一个thrift的Demo。虽然看起来很简单,确实废了不少功夫。下面列下我的步骤和我遇到的问题。

大家也可以参考这个博客:http://blog.csdn.net/hbuxiaoshe/article/details/6558391/

我这边多出来的只有自己遇到的问题总结。

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

一 编写thrift文件

学生信息使用thrift的struct即可,为了达到通信目的,我们需要写一个service。注意改出service的名字为Serv,方法名字为put。

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

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

二 生成cpp文件

thrift可以简易生成不同语言的代码,c++ python java等,此处我们只用--gen cpp第一个命令即可

thrift -r --gen cpp student.thrift#thrift -r --gen java student.thrift     //生成java代码#thrift -r --gen py student.thrift    //生成python代码

如下生成7个文件:Serv开头的文件是由service的名字生成的,查看Serv_server.skeleton.cpp可以看到put方法。这些文件可以编译,生成最初的客户端,编译命令如下:

cd到gen-cpp所在的文件夹,执行如下编译命令,注意生成的server可执行文件是在gen-cpp文件夹中的。

g++ -g -Ithrift -L  Serv.cpp student_types.cpp student_constants.cpp Serv_server.skeleton.cpp -o server -lthrift

1 Serv.cpp
2 Serv.h
3 Serv_server.skeleton.cpp     #简单的server端代码,可以修改,一般都参照它来写serve程序
4 student_constants.cpp
5 student_constants.h
6 student_types.cpp
7 student_types.h

三 编写客户端client.cpp

thrift最大的好处就是可用c++的服务端,java的客户端;java的服务端,python的客户端等。

中间"//我们的代码卸载这里"后续可以添加代码进去进行测试。

注意此处,原本的include的.h文件路径为下路径,我在运行时报错了,所以换成了全路径。

#include "Serv.h"  // 替换成你的.h
#include <transport/TSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TBinaryProtocol.h>
#include </home/xiaodan/MyThriftTest/student/gen-cpp/Serv.h>#include </usr/local/include/thrift/transport/TSocket.h>#include </usr/local/include/thrift/transport/TBufferTransports.h>#include </usr/local/include/thrift/protocol/TBinaryProtocol.h>
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;using boost::shared_ptr;int main(int argc, char **argv) {boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090)); //注意此处的ip和端口boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));transport->open();// 我们的代码写在这里
transport->close();return 0;
}

四 编译

我在这里踩了好几个坑,哭的都没泪了。贴一下我成功的命令。

cd 进入gen-cpp编译server端:g++ -g -Ithrift -L  Serv.cpp student_types.cpp student_constants.cpp Serv_server.skeleton.cpp -o server -lthrift
client.cpp我放在了gen-cpp的外面,所以编译client端:g++ -g -Ithrift -L -lm -pthread -lz -lrt -lssl gen-cpp/Serv.cpp gen-cpp/student_types.cpp gen-cpp/student_constants.cpp client.cpp -o client -lthrift

然后就可以在对应目录下分别看到两个可执行文件

-rwxrwxr-x 1 xiaodan xiaodan 599962 Apr 13 13:59 client

-rwxrwxr-x 1 xiaodan xiaodan 663617 Apr 13 13:57 server

分别启动,执行命令.

./server   //可以用ps -ef|grep server查看到启动进程号
./client

五 发送消息进行通信验证

我们把客户端client.cpp当做发送端,编写程序向服务端发送消息

在client.cpp中添加以下代码

  transport->open();    //********添加部分***********Student s;s.sno = 123;s.sname = "xiaoshe";s.ssex = 1;s.sage = 30;   ServClient client(protocol);client.put(s);  //********添加部分***********  transport->close();

在Serv_server.skeleton.cpp中添加打印信息如下:

void put(const Student& s) {// Your implementation goes hereprintf("put\n");printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage); //********次行为添加代码********}

再次编译运行

1 启动./server

2 再另外窗口执行./client

3 查看server窗口,即可看到打印信息如下:

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

七 问题与总结

1 编译client.cpp提示"client.cpp:2:31: fatal error:transport/TSocket.h:No such file or directory"

在当前路径下执行
find / -name 'TSocket'
发现该文件路径为/usr/local/include/thrift/transport/TSocket.h,于是更新client.cpp的include头文件的路径地址

2 编译client.cpp提示"找不到Serv.h"

同1,更改Serv.h路径为全路径即可

3 使用命令“g++ -g -Ithrift -L -lthrift -lm -pthread -lz -lrt -lssl gen-cpp/Serv.cpp gen-cpp/student_types.cpp gen-cpp/student_constants.cpp client.cpp -o client”编译client.cpp,日志报错: undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'等等

解决:将编译命令中的ithrift放到最后即可
好像是ithrift执行需要某些加载文件,放在前面的时候,它还没加载会找不到。具体不记得了,在别人的博客里看到过原因,关了就没再找到。感谢博客作者大神。

4 还有个问题,我没解决。编译完成执行过后,更新了Serv_server_skeletion.cpp和client.cpp,再次编译时发生了错误,如下,求问怎么回事?已经kill掉原server进程了。

/tmp/cckgAbGo.o: In function `ServProcessor::ServProcessor(boost::shared_ptr<ServIf>)':
/home/xiaodan/MyThriftTest/student/gen-cpp/Serv.h:205: undefined reference to `vtable for ServProcessor'
/home/xiaodan/MyThriftTest/student/gen-cpp/Serv.h:206: undefined reference to `ServProcessor::process_put(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)'
collect2: error: ld returned 1 exit status

5 server的启动也可以使用如下方式

Makefile文件:
BOOST_DIR = /usr/include/boost/
THRIFT_DIR = /usr/local/include/thrift
LIB_DIR = /usr/local/lib
GEN_SRC = ./gen-cpp/user_types.cpp ./gen-cpp/user_constants.cpp ./gen-cpp/UserService.cpp
default: server
server: UserServer.cppg++ -g -o UserServer -I${THRIFT_DIR} -I${BOOST_DIR}  -I./gen-cpp -L${LIB_DIR} -lthrift UserServer.cpp ${GEN_SRC}

在路径下执行make命令,即可看到日志文件log

转载于:https://www.cnblogs.com/zhaoxd07/p/5387215.html

Thrift框架使用C++的一个demo相关推荐

  1. [JavaWeb] SSM框架 部署运行第一个Demo

    pom.xml 配置文件 1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="htt ...

  2. android tcp socket框架_花了一个星期,我终于把RPC框架整明白了

    [51CTO.com原创稿件]RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想. RPC 是一种技术思想而 ...

  3. Thrift框架-Windows-C++ x64编译

    Thrift简介 Thrift是Facebook提供的一个跨语言的服务部署框架,可以实现客户端和服务器远程过程调用.相较于Google的grpc框架,Thrift对三方库依赖更少,编译更简单,并且运行 ...

  4. 【Thrift】Thrift框架和使用教程-- C/S框架使用教程

    1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和 ...

  5. Thrift入门及 Java 实现简单demo

    本文示例代码: github传送门 本文并未与spring boot集成,仅实现了demo.可以将本文中的类作为spring中的bean使用即可. 其实一开始是想集成的,后来发现thrift已经够头大 ...

  6. java struts2 demo,Struts2第一个Demo求指导

    Struts2第一个Demo求指点 本人初学Struts2,按照书上的示例自己写了一个Demo.配置文件及路径如下: login.jsp: pageEncoding="UTF-8" ...

  7. .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

    最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...

  8. NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

    最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...

  9. 一个demo学会jquery mobile

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile事件全解 jQuery Mobile 所有class选项 jQuery Mobile 所有data-*选项 一个demo学会jquery ...

最新文章

  1. android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...
  2. 2017 人工智能+内容生产研究报告【附下载】
  3. 自定义select 三角样式
  4. 以太网迎新增长 专家眼中的车载以太网及AVB技术
  5. 计算机丢失tlps,win7系统下PS提示计算机丢失tlpsplib10.dll文件的解决方法
  6. modbus-rtu qt4-serialport2------micro2440 as host
  7. [BZOJ 5072]小A的树
  8. python中http_Python中的HTTP错误
  9. 棋牌游戏框架解析(一)
  10. 你肯定遇到过这些电脑使用问题, 此文帮你快速解决一些常见的电脑问题(持续更新中, 建议收藏)
  11. 怎么查微信公众号服务器,微信公众号查询数据库,微信公众号数据库怎么查询?...
  12. 苹果手机通过扫描二维码下载APP
  13. 计算机cpu风扇不转怎么办,电脑cpu风扇不转是怎么回事
  14. Web3在新加坡,叩开世界的大门
  15. Scratch学习有什么优点
  16. 藏在煤箱中的文明:一个会说话的箱子能告诉我们什么?
  17. 2021中国大数据产业发展白皮书 附下载
  18. 张艾迪(创始人):年少创业与干净的我
  19. python99乘法表四种_Python 99乘法表实现的两种方式
  20. MATLAB如何进行封装打包成独立可执行exe.

热门文章

  1. Node.js ES6模块化
  2. Spring AOP注解
  3. Elasticsearch SQL插件
  4. opencv fast角检测
  5. Pandas Timedelta对象
  6. DataFrame 排序
  7. java 夏令时区_如何获得另一个时区的夏令时状态
  8. kubelet配置cni插件_Kubernetes CNI网络插件
  9. windows server 2016部署wsus服务
  10. VMware NSX part 1(介绍) part 2(NSX-Manager安装) part 3(NSX Controller部署)