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

 service hello {
void func1( )
}

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文件是空的,添加代码:

 #include <transport/TSocket.h>
#include "hello.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>
#include <string>
#pragma comment(lib, "libthrift.lib")
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server; using boost::shared_ptr; #pragma comment(lib,"libthrift.lib")//链接库文件 int main(int argc, char** argv) {
int port = ;
shared_ptr<TTransport> socket(new TSocket("127.0.0.1", ));
shared_ptr<TTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
helloClient client(protocol);
try{
transport->open(); client.func1(); transport->close();
}catch(TException& tx){
printf("ERROR:%s\n",tx.what());
}
getchar();
return ;
}

7)Server代码

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

 // This autogenerated skeleton file illustrates how to build a server.

 // You should copy it to another filename to avoid overwriting it.

 #include "hello.h"

 #include <thrift/protocol/TBinaryProtocol.h>

 #include <thrift/server/TSimpleServer.h>

 #include <thrift/transport/TServerSocket.h>

 #include <thrift/transport/TBufferTransports.h>

 #pragma comment(lib, "libthrift.lib")

 using namespace ::apache::thrift;

 using namespace ::apache::thrift::protocol;

 using namespace ::apache::thrift::transport;

 using namespace ::apache::thrift::server;

 using boost::shared_ptr;

 class helloHandler : virtual public helloIf {

  public:

   helloHandler() {

     // Your initialization goes here

   }

   void func1() {

     // Your implementation goes here

     printf("Hello Thrift\n");

   }

 };

 int main(int argc, char **argv) {

     //-----------------------------//
WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested =MAKEWORD( , ); err = WSAStartup( wVersionRequested, &wsaData );
//-------------------------------//
//对上面这段代码做个说明,这是依赖windows的一段代码
//到2014.9.2官网的稳定版0.9.1,仍需要这段代码才可以在windows下编译通过。
//但是如果用git clone最新版,这个错误已经修正
//最新版注释掉这段代码,一样可以在windows下编译通过。
//备注时间:2014.9.2 int port = ; shared_ptr<helloHandler> handler(new helloHandler()); shared_ptr<TProcessor> processor(new helloProcessor(handler)); shared_ptr<TServerTransport> serverTransport(new TServerSocket(port)); shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory()); shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory); server.serve(); return ; }

8)调试运行

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

总结

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

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

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

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

最新文章

  1. js学习笔记之标准库
  2. RESTful API你怎么看?
  3. HTTPS原理
  4. SSH整合所需的jar包
  5. 当滚动条滚动到页面底部自动加载增加内容的js代码
  6. Oracle体系结构知识点的运用
  7. C++问题-无法打开某个自定义源文件
  8. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
  9. 第二个C语言代码
  10. java.util.Hashtable源码分析
  11. C 字符/字符串常用函数
  12. [转]一步步搭建Ubuntu环境——dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题——安装Flashplayer出错 ------不错
  13. PE头的应用---插入代码到EXE或DLL文件中
  14. 【转】深入理解RunLoop
  15. 前端笔记之JavaScript面向对象(二)内置构造函数&amp;相关方法|属性|运算符&amp;继承&amp;面向对象
  16. MySQL中SELECT语句简单使用
  17. echarts (geo/map) 渐变效果
  18. 翻译:ZooKeeper OverView
  19. C# 反射Reflection Assembly
  20. vue.js及项目实战[笔记]— 05 WebPack

热门文章

  1. [Cypress] install, configure, and script Cypress for JavaScript web applications -- part1
  2. angular1.x 组件开发
  3. Missing &amp;#39;name&amp;#39; key attribute on element activity at AndroidMan
  4. DB主从一致性的几种解决方法
  5. Android - 监听Activity点击无效
  6. Vijos 1921 严厉的班长 【状态压缩动态规划】
  7. HttpServletRequestWrapper模拟实现分布式Session
  8. AjaxControlToolkit没有通过WebResource.axd加载css导致ajaxToolkit:TabPanel无法显示正确的样式
  9. python读取一个英文文件,并记录每个单词出现的次数,降序输出
  10. node安装与升级