我用的是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程序:
- #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文件並執行
編譯服務端: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
至此,客戶端已能向服務端發送數據了。