內容轉自:http://blog.csdn.net/hbuxiaoshe/article/details/6558391
原文內容如下:
我用的是c++,所以我舉一個c++的例子,簡單說一下thrift的使用入門。
例子描述是這樣的:我們將學生資訊(學號,姓名,性別,年齡)由用戶端發送到服務端。
實現這個例子,我們大致要做以下幾部分事情:
(1)書寫.thrift檔案
(2)產生cpp檔案
(3)編寫用戶端
(4)編譯cpp檔案並執行
(1)書寫.thrift檔案
學生資訊是有結構的,所以我們使用thrift的struct即可,為了達到通訊的目的,我們必須使用service。
所以最後書寫成的student.thrift檔案內容如下:
struct Student{
1: i32 sno,
2: string sname,
3: bool ssex,
4: i16 sage,
}
service Serv{
void put(1: Student s),
}
(2)產生cpp檔案
產生cpp檔案很簡單,只需要一個thrift命令即可:
/home/xiaoshe/opt/bin/thrift -r --gen cpp student.thrift
--gen 後指定產生的語言,產生的cpp儲存在目錄gen-cpp下
命令執行後,將會在./gen-cpp/目錄下產生如下檔案:
Serv.cpp
Serv.h
Serv_server.skeleton.cpp
student_constants.cpp
student_constants.h
student_types.cpp
student_types.h
注意檔案的大小寫:
Serv開頭的檔案是由service產生的,這個關鍵字很重要,下面還會見到以它開頭的類。
student是根據student.thrift檔案的名產生的。
這些檔案可以進行編譯,產生最初的服務端。
(3)編寫用戶端
使用thrift命令後,我們並沒有得到我們想要的用戶端client原始碼,因此用戶端程式要由我們自己編寫實現。然而很幸運,我們可以使用下面的程式碼片段來編寫我們client程式:
[c-sharp]
view plaincopyprint?
- #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;
- }
#include "Serv.h" //<br />替換成你的.h#include <transport/TSocket.h>#include<br /><transport/TBufferTransports.h>#include<br /><protocol/TBinaryProtocol.h>using namespace apache::thrift;using<br />namespace apache::thrift::protocol;using namespace<br />apache::thrift::transport;using boost::shared_ptr;int main(int argc,<br />char **argv) {boost::shared_ptr<TSocket> socket(new<br />TSocket("localhost", 9090));boost::shared_ptr<TTransport><br />transport(new TBufferedTransport(socket));<br />boost::shared_ptr<TProtocol> protocol(new<br />TBinaryProtocol(transport));transport->open();// 我們的代碼寫在這裡<br />transport->close();return 0;}
儲存成檔案client.cpp
(4)編譯cpp檔案並執行
編譯服務端: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
運行服務端:./server
運行用戶端:./client
(5)傳輸我們的資料Student資訊
到此用戶端已經連上了服務端,但服務端只有這樣的響應(No more data to read),因為二者之間還沒有資料互動。
我們把用戶端當做發送端,修改client.cpp向服務端發送資料。
在“// 我們的代碼寫在這裡”
寫下我們的代碼:
// 先建立一個Student類型的變數,Student是我們在student.thrift中定義過的
Student s;
s.sno = 123;
s.sname = "xiaoshe";
s.ssex = 1;
s.sage = 30;
// 再定義一個對象client,又是以"Serv"開頭的類
ServClient client(protocol);
// 最後調用put函數向服務端傳輸資料, put是student.thrift採用service定義的成員函數。
// 調用put後,服務端也調用相應的put()
client.put(s);
服務端負責接收資料,也做相應修改:
在類ServHandler()的put()中:
printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage);
最後編譯,運行服務端,啟動用戶端後,服務端收到訊息,顯示結果為:
put
sno=123 sname=xiaoshe ssex=1 sage=30
至此,用戶端已能向服務端發送資料了。
我用的是c++,所以我舉一個c++的例子,簡單說一下thrift的使用入門。
例子描述是這樣的:我們將學生資訊(學號,姓名,性別,年齡)由用戶端發送到服務端。
實現這個例子,我們大致要做以下幾部分事情:
(1)書寫.thrift檔案
(2)產生cpp檔案
(3)編寫用戶端
(4)編譯cpp檔案並執行
(1)書寫.thrift檔案
學生資訊是有結構的,所以我們使用thrift的struct即可,為了達到通訊的目的,我們必須使用service。
所以最後書寫成的student.thrift檔案內容如下:
struct Student{
1: i32 sno,
2: string sname,
3: bool ssex,
4: i16 sage,
}
service Serv{
void put(1: Student s),
}
(2)產生cpp檔案
產生cpp檔案很簡單,只需要一個thrift命令即可:
/home/xiaoshe/opt/bin/thrift -r --gen cpp student.thrift
--gen 後指定產生的語言,產生的cpp儲存在目錄gen-cpp下
命令執行後,將會在./gen-cpp/目錄下產生如下檔案:
Serv.cpp
Serv.h
Serv_server.skeleton.cpp
student_constants.cpp
student_constants.h
student_types.cpp
student_types.h
注意檔案的大小寫:
Serv開頭的檔案是由service產生的,這個關鍵字很重要,下面還會見到以它開頭的類。
student是根據student.thrift檔案的名產生的。
這些檔案可以進行編譯,產生最初的服務端。
(3)編寫用戶端
使用thrift命令後,我們並沒有得到我們想要的用戶端client原始碼,因此用戶端程式要由我們自己編寫實現。然而很幸運,我們可以使用下面的程式碼片段來編寫我們client程式:
[c-sharp]
view plaincopyprint?
- #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;
- }
#include "Serv.h" //<br />替換成你的.h#include <transport/TSocket.h>#include<br /><transport/TBufferTransports.h>#include<br /><protocol/TBinaryProtocol.h>using namespace apache::thrift;using<br />namespace apache::thrift::protocol;using namespace<br />apache::thrift::transport;using boost::shared_ptr;int main(int argc,<br />char **argv) {boost::shared_ptr<TSocket> socket(new<br />TSocket("localhost", 9090));boost::shared_ptr<TTransport><br />transport(new TBufferedTransport(socket));<br />boost::shared_ptr<TProtocol> protocol(new<br />TBinaryProtocol(transport));transport->open();// 我們的代碼寫在這裡<br />transport->close();return 0;}
儲存成檔案client.cpp
(4)編譯cpp檔案並執行
編譯服務端: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
運行服務端:./server
運行用戶端:./client
(5)傳輸我們的資料Student資訊
到此用戶端已經連上了服務端,但服務端只有這樣的響應(No more data to read),因為二者之間還沒有資料互動。
我們把用戶端當做發送端,修改client.cpp向服務端發送資料。
在“// 我們的代碼寫在這裡”
寫下我們的代碼:
// 先建立一個Student類型的變數,Student是我們在student.thrift中定義過的
Student s;
s.sno = 123;
s.sname = "xiaoshe";
s.ssex = 1;
s.sage = 30;
// 再定義一個對象client,又是以"Serv"開頭的類
ServClient client(protocol);
// 最後調用put函數向服務端傳輸資料, put是student.thrift採用service定義的成員函數。
// 調用put後,服務端也調用相應的put()
client.put(s);
服務端負責接收資料,也做相應修改:
在類ServHandler()的put()中:
printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage);
最後編譯,運行服務端,啟動用戶端後,服務端收到訊息,顯示結果為:
put
sno=123 sname=xiaoshe ssex=1 sage=30
至此,用戶端已能向服務端發送資料了。