Windows下安装Thrift框架的教程很多。本文的不同之处在于,不借助Cygwin或者MinGW,只用VS2010,和Thrift官网下载的源文件,安装Thrift并使用。

先从官网 下载这两个文件:

· thrift-0.9.1.tar.gz

· Thrift compiler for Windows (thrift-0.9.1.exe)

第一个文件是源代码包,第二个可执行文件用于在Windows下生成目标语言的桩代码。

除此以外,还需要boost库和libevent库。

安装Thrift

0)准备工作

thrift-0.9.1.tar.gz源码包

安装VS2010

安装boost库,我使用的boost1.51版本

安装libevent库,这里用的libevent-2.0.21-stable

1)解压缩thrift-0.9.1.tar.gz

进入\thrift-0.9.1\lib\cpp,VS2010打开Thrift.sln,有libthrift,libthriftnb两个工程。

两个工程的区别是,libthriftnb工程是非阻塞(non-blocking)模式的服务器,非阻塞模式需要依赖libevent库。

2)libthrift工程配置:

libthrift>属性->C/C++->常规->附加包含目录->\boost\boost_1_51

libthrift>属性->库管理器->常规->附加库目录->\boost\boost_1_51\lib

3)libthriftnb工程配置:

libthriftnb>属性->C/C++->常规->附加包含目录->

\boost\boost_1_51

\libevent-2.0.21-stable

\libevent-2.0.21-stable\include

\libevent-2.0.21-stable\WIN32-Code

libthriftnb>属性->库管理器->常规->附加库目录->

\boost\boost_1_51\lib

4)编译libthrift和libthriftnb工程

编译完成后,在\thrift-0.9.1\lib\cpp\Debug下生成libthrift.lib文件,和libthriftnb.lib文件。

选择release模式,则在\thrift-0.9.1\lib\cpp\Release下生成libthrift.lib文件和libthriftnb.lib文件。

至此,安装完成。

开发步骤

安装好thrift后,就可以开始开发了。开发过程分这么几步:

第1步: 写.thrift文件,也就是接口描述文件(Interface Description File);

第2步: 用Thrift compiler for Windows (thrift-0.9.1.exe) ,生成目标语言代码;

第3步: 服务器端程序引入thrift生成的代码,实现RPC业务代码。

第4步: 客户端引入代码,调用远程服务。

图中蓝色Thrift.exe就是从官网下载的第二个文件——“IDL翻译工具”,帮助你把.thrift文件“翻译”成目标语言的RPC代码。

例子

这个例子,远程Server提供一个函数。客户端调用这个函数。远程函数的功能很简单,就是输出“Hello Thrift”。

1)写.thrift文件

新建文本文件hello.txt,保存下面的内容后修改扩展名hello.thrift

  1. service hello {
  2. void func1( )
  3. }

2)生成目标语言代码

把官网下载到的第二个文件thrift-0.9.1.exe和hello.thrift放到一个目录(hello)下。

打开cmd命令行窗口,进入到这个目录,执行命令:

C:\Users\admin\Desktop\Hello>thrift-0.9.1.exe  --gen  cpp  hello.thrift

执行成功,在hello目录下,生成一个gen-cpp文件夹。

3)创建工程

Visual Studio 2010新建win32控制台应用程序。

项目名称 server

解决方案名称 hello

注意:附加选项中选择 勾选 空项目。

类似的,在hello解决方案下,再新建一个空项目client。

4)为项目添加文件

向Server项目添加文件。

复制gen-cpp文件夹中文件到Server工程,添加到Server工程中。

向Client项目添加文件。

复制gen-cpp文件夹中文件到Client工程,删除hello_server.skeleton.cpp,并额外添加client.cpp文件。

最终解决方案的文件结构是这样的:

5)配置项目属性

Sever工程 Server>属性->C/C++->常规->附加包含目录->\boost\boost_1_51

Sever工程 Server>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src

Sever工程 Server>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src\thrift

Sever工程 Server>属性->连接器->附加库目录->\boost\boost_1_51\lib

Sever工程 Server>属性->连接器->附加库目录->\thrift-0.9.1\lib\cpp\Debug

附加库目录指向的是刚刚编译出的Debug目录

类似的,Client工程也做这样的配置。

Client工程 Client>属性->C/C++->常规->附加包含目录->\boost\boost_1_51

Client工程 Client>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src

Client工程 Client>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src\thrift

Client工程 Client>属性->连接器->附加库目录->\boost\boost_1_51\lib

Client工程 Client>属性->连接器->附加库目录->\thrift-0.9.1\lib\cpp\Debug

6)Client代码

client.cpp文件是空的,添加代码:

  1. #include <transport/TSocket.h>
  2. #include "hello.h"
  3. #include <protocol/TBinaryProtocol.h>
  4. #include <server/TSimpleServer.h>
  5. #include <transport/TServerSocket.h>
  6. #include <transport/TBufferTransports.h>
  7. #include <string>
  8. #pragma comment(lib, "libthrift.lib")
  9. using namespace ::apache::thrift;
  10. using namespace ::apache::thrift::protocol;
  11. using namespace ::apache::thrift::transport;
  12. using namespace ::apache::thrift::server;
  13.  
  14. using boost::shared_ptr;
  15.  
  16. #pragma comment(lib,"libthrift.lib")//链接库文件
  17.  
  18. int main(int argc, char** argv) {
  19. int port = ;
  20. shared_ptr<TTransport> socket(new TSocket("127.0.0.1", ));
  21. shared_ptr<TTransport> transport(new TBufferedTransport(socket));
  22. shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
  23. helloClient client(protocol);
  24. try{
  25. transport->open();
  26.  
  27. client.func1();
  28.  
  29. transport->close();
  30. }catch(TException& tx){
  31. printf("ERROR:%s\n",tx.what());
  32. }
  33. getchar();
  34. return ;
  35. }

7)Server代码

hello_server.skeleton.cpp 文件已经有thrift生成的代码,稍作修改,最终如下:

  1. // This autogenerated skeleton file illustrates how to build a server.
  2.  
  3. // You should copy it to another filename to avoid overwriting it.
  4.  
  5. #include "hello.h"
  6.  
  7. #include <thrift/protocol/TBinaryProtocol.h>
  8.  
  9. #include <thrift/server/TSimpleServer.h>
  10.  
  11. #include <thrift/transport/TServerSocket.h>
  12.  
  13. #include <thrift/transport/TBufferTransports.h>
  14.  
  15. #pragma comment(lib, "libthrift.lib")
  16.  
  17. using namespace ::apache::thrift;
  18.  
  19. using namespace ::apache::thrift::protocol;
  20.  
  21. using namespace ::apache::thrift::transport;
  22.  
  23. using namespace ::apache::thrift::server;
  24.  
  25. using boost::shared_ptr;
  26.  
  27. class helloHandler : virtual public helloIf {
  28.  
  29. public:
  30.  
  31. helloHandler() {
  32.  
  33. // Your initialization goes here
  34.  
  35. }
  36.  
  37. void func1() {
  38.  
  39. // Your implementation goes here
  40.  
  41. printf("Hello Thrift\n");
  42.  
  43. }
  44.  
  45. };
  46.  
  47. int main(int argc, char **argv) {
  48.  
  49. //-----------------------------//
  50. WORD wVersionRequested;
  51.  
  52. WSADATA wsaData;
  53.  
  54. int err;
  55.  
  56. wVersionRequested =MAKEWORD( , );
  57.  
  58. err = WSAStartup( wVersionRequested, &wsaData );
  59. //-------------------------------//
  60. //对上面这段代码做个说明,这是依赖windows的一段代码
  61. //到2014.9.2官网的稳定版0.9.1,仍需要这段代码才可以在windows下编译通过。
  62. //但是如果用git clone最新版,这个错误已经修正
  63. //最新版注释掉这段代码,一样可以在windows下编译通过。
  64. //备注时间:2014.9.2
  65.  
  66. int port = ;
  67.  
  68. shared_ptr<helloHandler> handler(new helloHandler());
  69.  
  70. shared_ptr<TProcessor> processor(new helloProcessor(handler));
  71.  
  72. shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
  73.  
  74. shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
  75.  
  76. shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
  77.  
  78. TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  79.  
  80. server.serve();
  81.  
  82. return ;
  83.  
  84. }

8)调试运行

先启动Server工程,再启动Client工程。运行结果:

总结

到这里Thrift的安装和开发基本操作步骤就介绍完了。Thrift的官方文档不是很完善,本篇介绍的安装方法不在网上众多教程之列,主要区别是没有使用Cygwin或者MinGW。对于想使用Visual Studio作为开发环境的同学会很有帮助。

教程中需要的文件,都可以从网上获取,核心代码在文中已经展示,相信按图索骥一定可以成功的运行第一个Thrift的例子。

最后十分感谢陈晓苏(北京)同学,本篇教程整理自他/她名字的一个文件夹。我从Thrift交流QQ群193713524的共享中获得的。这里增加了一些图片说明和我的理解。最后的例子,做了简化,是为了直接、清晰的说明安装过程和开发的配置。

转自:http://blog.csdn.net/colouroo/article/details/38588297

Apache Thrift 在Windows下的安装与开发的更多相关文章

  1. mysql 在windows下的安装,开发基础与要点

    1:安装(windows下) 官网下载.msi文件 运行安装时只需要安装server就行了 在环境变量中配置到bin目录:e.g:C:\programFile\...mysql\bin 完成后进入wi ...

  2. Apache+php在windows下的安装和配置

    下载和配置php   下载php:http://windows.php.net/download/  php-5.4.16-Win32-VC9-x86.zip  下载apache: http://ht ...

  3. Windows下单机安装Spark开发环境

    机器:windows 10 64位. 因Spark支持java.python等语言,所以尝试安装了两种语言环境下的spark开发环境. 1.Java下Spark开发环境搭建 1.1.jdk安装 安装o ...

  4. Thrift架构~windows下安装和Hello World及编码引起的错误

    最近开始正式接触Thrift架构,很牛B的技术,它被apache收纳了,属于开源中的一员,呵呵. 概念: Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基 ...

  5. windows下手动安装 Apache+php+mysql

    PHP 为什么先说php,因为apache的配置要写入php的一些路径 http://php.net/downloads.php  选择windows donwload 选择Thread Safe的版 ...

  6. [转载]Apache在windows下的安装配置

    Apache在windows下的安装配置 转载自:http://blog.sina.com.cn/s/blog_536f16b00100cfat.html     1 Apache的下载 Apache ...

  7. spark在windows下的安装

      Windows下最简的开发环境搭建这里的spark开发环境, 不是为apache spark开源项目贡献代码, 而是指基于spark的大数据项目开发. Spark提供了2个交互式shell, 一个 ...

  8. memcache的windows下的安装和简单使用

    原文:memcache的windows下的安装和简单使用 memcache是为了解决网站访问量大,数据库压力倍增的解决方案之一,由于其简单实用,很多站点现在都在使用memcache,但是memcach ...

  9. Windows下memcache安装使用

    Windows下Memcache安装 随着时间的推移,网上现在能找到的在 Windows下安装 Memcache 的文档大多已经过时.雪峰这里再简要介绍一下当下最新版的安装和配置方法. Memcach ...

随机推荐

  1. Vue 开发线路 资料 汇总

    线路 作者推荐学习线路 https://zhuanlan.zhihu.com/p/23134551 他人建议 https://www.cnblogs.com/smartXiang/p/6051086. ...

  2. 关于IP地址与MAC地址(网卡硬件地址)的区别小谈

    IP地址是指Internet协议使用的地址,而MAC地址是Ethernet协议使用的地址. IP地址与MAC地址之间并没有什么必然的联系,MAC地址是Ethernet NIC(网卡)上带的地址,为48 ...

  3. com.sun.jdi.InvocationException occurred invoking method 异常

    参考链接:https://stackoverflow.com/questions/4123628/com-sun-jdi-invocationexception-occurred-invoking-m ...

  4. 【转载】WebService相关概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  5. 【C语言】统计数字在排序数组中出现的次数

    //数字在排序数组中出现的次数. //统计一个数字在排序数组中出现的次数.比如:排序数组{1,2,3,3,3,3,4,5}和数字3,因为3出现了4次,因此输出4. #include <stdio ...

  6. hadoop shuffle

    1 hadoop shuffle的地位 hadoop  shuffle是map reduce算法的核心,是它连接了多个map和多个reduce,它将map的输出交给reduce作为输入. 2 hado ...

  7. Mac 下如何安装pip 和xlwt

    sudo easy_install pip pip install xlwt sudo pip install xlwt sudo pip install requests

  8. hadoop-client

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> ...

  9. WIFI的通信知识整理

    这两天在解决wifi芯片的一个底层问题,看了很多资料,下面做一个简要记录: 1.信号调制的基本原理 链接:http://wenku.baidu.com/link?url=3K6Z5fBIN20lPzB ...

  10. 字符串查找函数(BF)

    //模拟字符串定位函数 // s: abcbbghi // t: ghi // 返回6 #include <iostream> #include <string> #inclu ...