您的位置:首页 > 运维架构 > Linux

linux和windows下通信的thrift

2015-07-09 09:55 471 查看
1、简介

首先介绍下thrift的作用,thrift的全名叫做Apache thrift,是一款软件开发RPC框架,可以很高效地实现跨语言的RPC服务。

RPC:远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

2、使用方法(先说Linux实现方法再说Windows下实现方法)

使用thrift的文档网上真的不多,何况写的又不全,而且没做过的人基本一步一挫折,所以这个文档我尽量写我遇到的各种问题和规避方法。

首先,我先下载的是thrift-0.9.2 版本,因为官网给出的最新版本就是0.9.2版本,我声明一下,0.8.0之前的版本在windows编译极其麻烦,0.8.0之后的版本在windows下使用相对容易,因为有了thrift.exe(全名是thrift-0.9.0.exe,但是0.9.0以前的版本我没找到可执行文件,而且通过compiler去编译也有错误,很是郁闷,最后在群里管网友要了一个,很是感激啊)。编译thrift时候,官网给出了几个必要包和可选包(当然全是英文版,有时候你可能注意不到,很多网上给的资料并没列出这几个必要包。)其中boost是最最重要的,没有这个包基本你什么都干不了,虽然能编译,但是相应的动态库全没有,所以先下载下来(boost并没有特殊的版本限定,我就随便找了一个用)。

再说说thrift版本的问题,最开始下载的是0.9.2版本和0.9.1版本,在linux运行的时候出现了bison版本不对的现象,于是我就上网找资料,说要升级到2.5以上版本,我就下载了升级,升级好几次的结果是你干升,它升不上去,始终都是2.4版本。网上也没有详细的资料说明怎么办。于是我就换成了thrift-0.8.0版本。这个版本至少对我现在的系统没有太多要求,编译也通过了。

下面给一个boost的下载地址 http://www.boost.org/

这有最新版本,自己下一下就可以。

下面给出安装boost的具体方法:

1、下载文件并解压到默认目录

2.解压后,进入boost_1_53_0目录,执行:./bootstrap.sh

3.(重点)修改 tools/build/v2/user-config.jam文件,在最后面加上一行“using mpi ;”(注意mpi后面有个空格, 然后一个分号 )(网上资料说要修改,因为我没用所以没修改)

4. 执行: ./b2

5. 执行:sudo ./b2 install

以上便是全部安装过程,因为网上提到的比较多,所以此处从略。重点想提的是第三步,务必记得。不过,如果你的程序不需要mpi这个功能,那也就不重要了。应用默认设置即可。而且,第四步,执行时可以在后面家prefix参数,如果不加,装好后,默认的头文件在/usr/local/include/boost目录下。库文件在/usr/local/lib/目录下。默认不用修改。

如果编译好程序后,在运行时提示无法加载某个库文件,则把/usr/local/lib下的所有boost的库文件mv到/usr/lib目录下就可以了。

(这个以上是网友给的安装方法,我严格执行的是可以实现的,但是由于系统版本不一样)

然后安装thrift

1、下载一个thrift-0.8.0.tar.gz(我会随压缩包给出此版本)

2、tar -xvf thrift-0.8.0.tar.gz 解压缩文件

3、cd thrift-0.8.0 进入Thrift安装主目录

4、./configure (可能出现权限不够,请修改文件权限sudo chmod 777 configure)

5、make

6、 sudo make install

(特别注意:第四步,这一步特别坑,由于我第一次接触linux习惯指定安装路径,第四步也是指定安装目录的,于是我就指定了安装路径,后来编译的时候找不到thrift命令,搞了半天也没搞明白为什么,所以强烈建议不要指定安装路径!)

然后再给出一个网上的demo程序

\http://blog.163.com/zhangjie_0303/blog/static/9908270620140311022650/

(当然程序不完全对,他的makefile内容不对,编译后各种错误,这可能是系统版本不一样导致的,我也给出我的makefile内容,不过要注意的是)

BOOST_DIR = /usr/local/include/boost/

THRIFT_DIR = /usr/local/include/thrift/

LIB_DIR = /home/ngos/demo/gen-cpp/lib

GEN_SRC = UserStorage.cpp demo_constants.cpp demo_types.cpp

default: server client

server: UserStorage_server.cpp

g++ -g -DHAVE_NETINET_IN_H -I. -I${THRIFT_DIR} -I${BOOST_DIR} -I../gen-cpp -L${LIB_DIR} UserStorage_server.cpp -o CppServer -lthrift -lthriftnb -levent -lrt ${GEN_SRC}

client: CppClient.cpp

g++ -g -DHAVE_NETINET_IN_H -I${THRIFT_DIR} -I${BOOST_DIR} -I../gen-cpp -L${LIB_DIR} CppClient.cpp -o CppClient -lthrift -lthriftnb -levent -lrt ${GEN_SRC}

clean:

$(RM) -r CppClient CppServer

加黄色的是我主要改的,如果没有-DHAVE_NETINET_IN_H 这个的话可能导致uint_32等不识别的问题(这个要多谢小刘老师的帮忙,否则真心被虐哭了!)这样基本就差不多了,Linux版本我第一次用,网上的资料不多,不多不重要还各种坑。

留个我的邮箱有问题随时留言,有空就回best_cc@126.com

接着我说下在windows下版本的,网上也给出不少资料,但是也是各种坑啊。本来我以为都差不多了,但是发现根本不对。首先为了支持跨平台,就不能用win32控制台程序,因为是跨平台必须不能有mfc相关的东西(这块要感谢陈国组长大神的支持,否则我真意识不到,编译出来各种奇葩问题,看着都虐心。)必须使用空的项目,自己来添加内容。不过也有个相对不错的教程,我贴到此处,和他不符的地方我会贴出来。

/article/10631978.html (这是比较全的博客,回头我有时间再整理吧)

http://jingyan.baidu.com/article/a3aad71aa1ebe7b1fb009681.html (这个博客是教你如何编译boost文件夹的)

其实,我觉得文档写的不错,不过确实很多细节没写到,着实花费了我很多功夫去搞。先说第一个文档吧,因为大家使用的thrift版本不一样,所以按照那个设置就可以,有些引用他有你没有的就别引用了。但是他说用win32的控制台程序,这点着实坑了我一下子,编译完了各种离奇错误,根本都不敢改,因为是编译出来的源码,所以肯定不敢动。

这块提到的win32控制台应用程序建立一个空项目!切记切记,因为跨平台必须没有mfc那套东西!至于mfc如何使用那以后谁有兴趣谁研究下吧!

第二个,你用thrift.exe生成根本没有hello.h 和 Hello.cpp文件,大家也别在意这两个文件,用你之前linux那个教程中的那个client.cpp就可以了。也不用于纠结在此了。

第三个确实狠狠的坑了我一把,

看红色的标记地方,boost文件夹下根本没有lib文件夹,只有个libs,基于之前的问题我以为他写错了呢,我就去引入了libs,说缺少相应的静态库。于是我就找,我发现原来是boost没有编译。于是我就去找boost如何编译,网上给出各种编译boost中的bajm.exe和b2.exe的方法,但是全是基于32位系统的,关键还都没说,最后我在boost文件夹下发现了有64位编译的方法:

1) 从开始菜单启动vs2010下的x64 win64 cmd窗口

2) 到BOOST下执行boostrap.bat生成相应版本的bjam

3) bjam.exe --toolset=msvc-10.0 architecture=x86 address-model=64 link=static --build-type=complete --with-system --with-thread --with-date_time --with-filesystem --with-serialization

然后我又采用第二个链接去编译静态库,这块花费了我几乎一个下午的时间。因为你编译命令不一样编译出来的结果也不一样,如果命令不一样你静态库名字也不一样,这样你还是找不到你的静态库。

看我画红色圈出来的地方,他写的没错但是只是够他自己用,你会发现编译出来还是缺少静态库,下面我告诉大家如何改

--toolset=msvc-12.0 --stagedir="C:\Boost\boost_vc_120" l

这句话是你生成的版本和指定的vc_120版本,这个必须有,vs2010用的10,所以要全改为10。(这个必须保留,默认是12也就是2013版本)

debug release 这个是生成debug版本还是release版本。可选一个,为了防止编译错误还是都用吧。

stage 干什么用我不清楚,可有可无

link=shared runtime-link=shared 这个是决定你静态库名字的问题

如果你加的话静态库名字会加多个s,如下:

不加的话才会去掉s,如下:

为了干掉这个s我编译了八遍,几乎每次都是20分钟,真的有点让我很无奈。

编译好了把产生的lib和include拷贝到boost文件夹下,然后重新编译你的工程就哦了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: