grpc vs配置参考:https://blog.csdn.net/wangxudongx/article/details/104233213 vs配置过程出现问题的一些解决:https://blog.csdn.net/xie1xiao1jun/article/details/52514206
服务端
//服务端
#include "grpcpp\grpcpp.h"
#include "hello.pb.h"
#include "hello.grpc.pb.h"
#include<iostream>
using grpc::Server; //声明服务类型
using grpc::ServerBuilder; //声明创建服务的类
using grpc::ServerContext;
using grpc::Status;
using helloworld::HelloRequest; //服务请求类型
using helloworld::HelloReply; //服务回话类型
using helloworld::Greeter;
class Server_hello final: public Greeter::Service
{
Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply)
{
std::string reply_txt("Hello ");
std::string reply_txt1(" by service");
reply->set_message(reply_txt + request->name() + reply_txt1);
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50071");
Server_hello service;
ServerBuilder builder; //创建服务端
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); //设置服务端监听地址
builder.RegisterService(&service); //注册服务
// 最后,组装服务器
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
// 等待服务器关闭。 请注意,必须是其他一些线程
// 负责关闭服务器以便此调用永远返回。
server->Wait();
}
int main(int argc, char** argv) {
std::cout << "start service" << std::endl;
RunServer();
return 0;
}
客户端
//客服端
#include "grpcpp\grpcpp.h"
#include "hello.pb.h"
#include "hello.grpc.pb.h"
#include <iostream>
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using helloworld::HelloRequest;
using helloworld::HelloReply;
using helloworld::Greeter;
class GreeterClient {
public:
GreeterClient(std::shared_ptr<Channel> channel): stub_(Greeter::NewStub(channel)) {}
// 组装客户端的有效载荷,发送它并返回响应
//来自服务器。
std::string SayHello(const std::string& user)
{
// Data we are sending to the server.
HelloRequest request;
request.set_name(user);
// 我们期望来自服务器的数据的容器。
HelloReply reply;
// 客户端的上下文。 它可以用来传达额外的信息给
// 服务器和/或调整某些 RPC 行为。
ClientContext context;
// 实际的 RPC。
Status status = stub_->SayHello(&context, request, &reply);
// 根据其状态采取行动。
if (status.ok()) {
return reply.message();
}
else {
std::cout << status.error_code() << ": " << status.error_message()
<< std::endl;
return "RPC failed";
}
}
private:
std::unique_ptr<Greeter::Stub> stub_;
};
int main(int argc, char** argv) {
// 实例化客户端。 它需要一个通道,实际的 RPC 从中
// 被创建。 此通道建模与端点的连接(在这种情况下,
// 本地主机在端口 50051)。 我们表明频道未通过身份验证
//(使用 InsecureChannelCredentials())。
GreeterClient greeter(grpc::CreateChannel("localhost:50071", grpc::InsecureChannelCredentials()));
std::string user("world");
std::string reply = greeter.SayHello(user);
std::cout << "Greeter received: " << reply << std::endl;
std::cin.get();
return 0;
}
|