Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

c++ grpc

作者:步崖   发布日期:2025-04-30   浏览:107

// C++ gRPC 示例代码

// 首先需要安装 gRPC 和 Protocol Buffers,并生成相应的 .proto 文件的 C++ 代码。

// 假设我们有一个简单的 .proto 文件定义了一个服务和消息类型:
// example.proto
syntax = "proto3";

package example;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

// 生成的 C++ 代码将包含客户端和服务器的存根(stubs),我们可以基于这些存根编写实际的客户端和服务器代码。

// 服务器端代码示例:
#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>
#include "example.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using example::Greeter;
using example::HelloRequest;
using example::HelloReply;

class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
    std::string prefix("Hello ");
    reply->set_message(prefix + request->name());
    return Status::OK;
  }
};

void RunServer() {
  std::string server_address("0.0.0.0:50051");
  GreeterServiceImpl 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) {
  RunServer();
  return 0;
}

// 客户端代码示例:
#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>
#include "example.grpc.pb.h"

using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using example::Greeter;
using example::HelloRequest;
using example::HelloReply;

class GreeterClient {
 public:
  GreeterClient(std::shared_ptr<Channel> channel)
      : stub_(Greeter::NewStub(channel)) {}

  std::string SayHello(const std::string& user) {
    // 创建请求对象
    HelloRequest request;
    request.set_name(user);

    // 创建响应对象
    HelloReply reply;

    // 上下文用于传递额外信息
    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) {
  // 创建客户端并连接到服务器
  GreeterClient greeter(grpc::CreateChannel(
      "localhost:50051", grpc::InsecureChannelCredentials()));
  std::string user("world");
  std::string reply = greeter.SayHello(user);
  std::cout << "Greeter received: " << reply << std::endl;

  return 0;
}

解释说明:

  1. .proto 文件:定义了服务和消息类型。Greeter 服务有一个 SayHello 方法,接收一个 HelloRequest 消息并返回一个 HelloReply 消息。
  2. 服务器端代码
    • GreeterServiceImpl 类实现了 Greeter 服务接口中的 SayHello 方法。
    • RunServer 函数设置了服务器监听地址,并启动了 gRPC 服务器。
  3. 客户端代码
    • GreeterClient 类封装了与服务器通信的逻辑。
    • SayHello 方法发送 HelloRequest 并接收 HelloReply
  4. gRPC 库:使用了 gRPC 的 C++ API 来创建通道、上下文、请求和响应对象,并进行 RPC 调用。

通过这些代码,你可以实现一个简单的 gRPC 客户端-服务器应用程序。

上一篇:c++爬虫

下一篇:c++ bind

大家都在看

c++闭包

c++单引号和双引号的区别

c++ 注释

c++如何判断素数

c++freopen怎么用

c++ 获取系统时间

c++进制转换函数

c++ vector 清空

c++ tcp

c++ gcd函数

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站