最近須要使用Thrift,因此在網上看了不少資料,不過不少教程都不夠詳細完整,致使我花了很多時間安裝配置。在這裏我把我配置的過程寫下來和你們分享。html
Apache Thrift 是一個跨語言的遠程過程調用框架(RPC,Remote Procedure Call)。首先使用接口描述語言(IDL,Interface Description Language)編寫 .thrift 文件,而後經過 Thrift 編譯成C++、JAVA、C# 等語言的代碼。這些代碼之間能夠互相遠程調用。Thrift 封裝了底層網絡通訊的內容,用戶只須要編寫頂層邏輯代碼就能夠了。ios
{boost 安裝目錄}\boost_1_64_0;{boost 安裝目錄}\boost_1_64_0\boost;{OpenSSL 目錄}\inc32
{OpenSSL 目錄}\out32dll
{boost 安裝目錄}\boost_1_64_0;{boost 安裝目錄}\boost_1_64_0\boost;{OpenSSL 目錄}\inc32;{libevent_install_dir};{libevent_install_dir}\include;{libevent_install_dir}\WIN32-Code;
{OpenSSL 目錄}\out32dll
# Hello.thrift namespace cpp Demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() }
編譯生成 C++ 源文件,會生成 gen-cpp文件夾
thrift -r --gen cpp Hello.thrift
生成的文件以下:
apache
新建 Visual Studio 項目,並將生成的文件粘貼入項目文件夾中。
windows
咱們只須要實現Hello_server.skeleton.cpp
中的方法便可。服務器
右鍵項目,點擊屬性 > C/C++ > 常規 > 附加包含目錄,添加:
{thrift 安裝目錄}\lib\cpp\src;{thrift 安裝目錄}\lib\cpp\src\thrift\windows;{boost 安裝目錄}\boost\boost_1_64_0;%(AdditionalIncludeDirectories)
網絡
點擊連接器 > 常規 > 附加庫目錄,添加:
{boost 安裝目錄}\boost\boost_1_64_0\stage\lib;{thrift 安裝目錄}\lib\cpp\Debug;%(AdditionalLibraryDirectories)
框架
點擊連接器 > 全部選項 > 附加依賴項,添加:
libboost_thread-vc141-mt-gd-1_64.lib;libboost_chrono-vc141-mt-gd-1_64.lib;libthrift.lib;
socket
Hello_server.skeleton.cpp
源文件main
函數前面加上以下代碼:WSADATA wsaData = {}; WORD wVersionRequested = MAKEWORD(2, 2); int err = WSAStartup(wVersionRequested, &wsaData);
這些庫的名稱要以你本身安裝的庫爲準,你須要去boost文件夾中查看這些庫的準確名稱。上面 {} 裏面的安裝目錄也是這樣。函數
和 Server 的配置過程同樣,只不過咱們不用Hello_server.skeleton.cpp
。咱們須要本身編寫客戶端:測試
#include "Hello.h" #include <thrift/transport/TSocket.h> #include <thrift/transport/TBufferTransports.h> #include <thrift/protocol/TBinaryProtocol.h> #include <iostream> #include <string> 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)); // 只須要實例化 HelloClient,而後就能夠遠程過程調用了 Demo::HelloClient client(protocol); transport->open(); // Your Codes std::cout << client.helloInt(10030341) << std::endl; std::string tem = "hello from Client"; client.helloString(tem, tem); std::cout << tem << std::endl; transport->close(); return 0; }