用C++写一个thrift例子,包含服务器和客户端
时间: 2023-12-03 18:47:10 浏览: 112
Thrift下java服务器与客户端开发指引.pdf
以下是一个简单的 Thrift 示例,包含服务器和客户端,使用 C++ 编写。
1. 首先,我们需要定义一个 Thrift IDL 文件。在这个例子中,我们定义了一个简单的服务,可以将两个整数相加并返回结果。在一个名为 "math.thrift" 的文件中,我们写下以下代码:
```
namespace cpp tutorial
service Calculator {
i32 add(1:i32 num1, 2:i32 num2)
}
```
2. 接下来,我们需要使用 Thrift 编译器生成 C++ 代码。在终端中运行以下命令:
```
thrift --gen cpp math.thrift
```
这将生成一个 "gen-cpp" 文件夹,其中包含 Thrift 自动生成的 C++ 代码。
3. 现在,我们可以着手编写服务器端代码。在一个名为 "server.cpp" 的文件中,我们编写以下代码:
```cpp
#include <iostream>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include "gen-cpp/Calculator.h"
using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace apache::thrift::server;
using namespace cpp_tutorial;
class CalculatorHandler : public CalculatorIf {
public:
CalculatorHandler() {}
int32_t add(const int32_t num1, const int32_t num2) {
cout << "Adding " << num1 << " and " << num2 << endl;
return num1 + num2;
}
};
int main(int argc, char** argv) {
int port = 9090;
shared_ptr<CalculatorHandler> handler(new CalculatorHandler());
shared_ptr<TProcessor> processor(new CalculatorProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
cout << "Starting the server..." << endl;
server.serve();
cout << "Done." << endl;
return 0;
}
```
这个代码片段创建了一个 `CalculatorHandler` 类,它实现了 "add" 方法,将两个整数相加并返回结果。然后,我们创建一个 `CalculatorProcessor` 对象来处理客户端请求,并使用 `TSimpleServer` 类来启动服务器。
4. 最后,我们需要编写客户端代码。在一个名为 "client.cpp" 的文件中,我们编写以下代码:
```cpp
#include <iostream>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TSocket.h>
#include "gen-cpp/Calculator.h"
using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace cpp_tutorial;
int main(int argc, char** argv) {
shared_ptr<TTransport> socket(new TSocket("localhost", 9090));
shared_ptr<TTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
CalculatorClient client(protocol);
try {
transport->open();
int32_t num1 = 3;
int32_t num2 = 5;
int32_t sum = client.add(num1, num2);
cout << "Sum of " << num1 << " and " << num2 << " is: " << sum << endl;
transport->close();
} catch (TException& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}
```
这个代码片段创建了一个 `TSocket` 对象,用于连接到服务器的地址和端口。然后,我们使用 `TBufferedTransport` 和 `TBinaryProtocol` 对象创建 `CalculatorClient` 对象,并调用 `add` 方法。最后,我们关闭传输并打印出结果。
5. 最后,我们可以编译并运行服务器和客户端。在终端中分别运行以下命令:
```
g++ -std=c++11 -o server server.cpp gen-cpp/*.cpp -lthrift
```
```
g++ -std=c++11 -o client client.cpp gen-cpp/*.cpp -lthrift
```
然后,首先运行服务器:
```
./server
```
接下来,运行客户端:
```
./client
```
输出应该会类似于以下内容:
```
Starting the server...
Adding 3 and 5
Done.
Sum of 3 and 5 is: 8
```
这表明服务器已经启动,并且客户端能够成功调用服务器的方法并接收返回值。
阅读全文