linux和windows下通信的thrift

1、簡介

首先介紹下thrift的作用,thrift的全名叫做Apache thrift,是一款軟件開發RPC框架,可以很高效地實現跨語言的RPC服務。

RPC:遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCPUDP,爲通信程序之間攜帶信息數據。在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(我會隨壓縮包給出此版本)

2tar -xvf thrift-0.8.0.tar.gz 解壓縮文件

3cd thrift-0.8.0 進入Thrift安裝主目錄

4./configure (可能出現權限不夠,請修改文件權限sudo chmod 777 configure)

5make

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版本我第一次用,網上的資料不多,不多不重要還各種坑。

留個我的郵箱有問題隨時留言,有空就回[email protected]

 

接着我說下在windows下版本的,網上也給出不少資料,但是也是各種坑啊。本來我以爲都差不多了,但是發現根本不對。首先爲了支持跨平臺,就不能用win32控制檯程序,因爲是跨平臺必須不能有mfc相關的東西(這塊要感謝陳國組長大神的支持,否則我真意識不到,編譯出來各種奇葩問題,看着都虐心。)必須使用空的項目,自己來添加內容。不過也有個相對不錯的教程,我貼到此處,和他不符的地方我會貼出來。

http://blog.csdn.net/colouroo/article/details/38588297 (這是比較全的博客,回頭我有時間再整理吧)

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.exeb2.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分鐘,真的有點讓我很無奈。

編譯好了把產生的libinclude拷貝到boost文件夾下,然後重新編譯你的工程就哦了。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章