thrift一個(gè)例子 - xiaoshe的專欄 - 博客頻道 - CSDN.NET
我用的是c++,所以我舉一個(gè)c++的例子,簡單說一下thrift的使用入門。
例子描述是這樣的:我們將學(xué)生信息(學(xué)號,姓名,性別,年齡)由客戶端發(fā)送到服務(wù)端。
實(shí)現(xiàn)這個(gè)例子,我們大致要做以下幾部分事情:
(1)書寫.thrift文件
(2)生成cpp文件
(3)編寫客戶端
(4)編譯cpp文件并執(zhí)行
?
(1)書寫.thrift文件
學(xué)生信息是有結(jié)構(gòu)的,所以我們使用thrift的struct即可,為了達(dá)到通信的目的,我們必須使用service。
所以最后書寫成的student.thrift文件內(nèi)容如下:
struct Student{
?1: i32 sno,
?2: string sname,
?3: bool ssex,
?4: i16 sage,
}
service Serv{
?void put(1: Student s),
}(2)生成cpp文件
生成cpp文件很簡單,只需要一個(gè)thrift命令即可:
/home/xiaoshe/opt/bin/thrift -r --gen cpp student.thrift
--gen 后指定生成的語言,生成的cpp存儲在目錄gen-cpp下
命令執(zhí)行后,將會在 ./gen-cpp/ 目錄下生成如下文件:
Serv.cpp
Serv .h
Serv _server.skeleton.cpp
student _constants.cpp
student _constants.h
student _types.cpp
student _types.h
注意文件的大小寫:
Serv開頭的文件是由service生成的,這個(gè)關(guān)鍵字很重要,下面還會見到以它開頭的類。
student是根據(jù)student.thrift文件的名生成的。
這些文件可以進(jìn)行編譯,生成最初的服務(wù)端。
?
(3)編寫客戶端
使用 thrift 命令后,我們并沒有得到我們想要的客戶端 client 源代碼,因此客戶端程序要由我們自己編寫實(shí)現(xiàn)。然而很幸運(yùn),我們可以使用下面的代碼段來編寫我們 client 程序:
?
- #include?"Serv.h"??//?替換成你的.h ??
- #include?<transport/TSocket.h> ??
- #include?<transport/TBufferTransports.h> ??
- #include?<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));??
- ????boost::shared_ptr<TTransport>?transport( new ?TBufferedTransport(socket));??
- ????boost::shared_ptr<TProtocol>?protocol( new ?TBinaryProtocol(transport));??
- ??
- ????transport->open();??
- ??
- ???? //?我們的代碼寫在這里 ??
- ??
- ????transport->close();??
- ??
- ???? return ?0;??
- }??
?
保存成文件client.cpp
(4)編譯cpp文件并執(zhí)行
編譯服務(wù)端:g++ -g -I/home/xiaoshe/opt/include/thrift -L/home/xiaoshe/opt/lib/ -lthrift Serv.cpp student_types.cpp?student_constants.cpp Serv_server.skeleton.cpp -o server
?
編譯客戶端:g++ -g -I/home/xiaoshe/opt/include/thrift -L/home/xiaoshe/opt/lib/ -lthrift -lm -pthread -lz -lrt -lssl Serv.cpp student_types.cpp student_constants.cpp client.cpp -o client
運(yùn)行服務(wù)端:./server
運(yùn)行客戶端:./client
?
(5)傳輸我們的數(shù)據(jù)Student信息
到此客戶端已經(jīng)連上了服務(wù)端,但服務(wù)端只有這樣的響應(yīng)(No more data to read),因?yàn)槎咧g還沒有數(shù)據(jù)交互。
我們把客戶端當(dāng)做發(fā)送端,修改client.cpp向服務(wù)端發(fā)送數(shù)據(jù)。
在“ // 我們的代碼寫在這里”
寫下我們的代碼:
// 先創(chuàng)建一個(gè)Student類型的變量,Student是我們在student.thrift中定義過的
?Student s;
?s.sno = 123;
?s.sname = "xiaoshe";
?s.ssex = 1;
?s.sage = 30;// 再定義一個(gè)對象client,又是以"Serv"開頭的類
?ServClient client(protocol);
// 最后調(diào)用put函數(shù)向服務(wù)端傳輸數(shù)據(jù), put是student.thrift采用service定義的成員函數(shù)。
// 調(diào)用put后,服務(wù)端也調(diào)用相應(yīng)的put()
?client.put(s);?
?
服務(wù)端負(fù)責(zé)接收數(shù)據(jù),也做相應(yīng)修改:
在類ServHandler()的put()中:
printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage);
?
最后編譯,運(yùn)行服務(wù)端,啟動客戶端后,服務(wù)端收到消息,顯示結(jié)果為:
put
sno=123 sname=xiaoshe ssex=1 sage=30至此,客戶端已能向服務(wù)端發(fā)送數(shù)據(jù)了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
