gRPC 四模式之 服务器端流RPC模式

服务器端流RPC模式

在一元 RPC 模式中,gRPC 服务器端和 gRPC 客户端在通信时始终只有一个请求和一个响应。在服务器端流 RPC 模式中,服务器端在接收到客户端的请求消息后,会发回一个响应的序列。这种多个响应所组成的序列也被称为"流"。在将所有的服务器端响应发送完毕之后,服务器端会以 trailer 元数据的形式将其状态发送给客户端,从而标记流的结束。

c++ 实现服务器端主动推送消息

在gRPC中,服务端主动向客户端发送数据通常是通过服务器端流式RPC实现的。在这种模式下,客户端发送一个请求到服务器,获取一个读取服务端流的响应。这种模式可以让服务器主动推送消息给客户端。

以下是一个C++的例子,展示了一个简单的服务器端流式RPC的实现:

cpp 复制代码
// .proto file
service MyService {
  rpc MyStreamingMethod(MyRequest) returns (stream MyResponse);
}

// Server implementation
class MyServiceImpl final : public MyService::Service {
  Status MyStreamingMethod(const MyRequest* request, ServerWriter<MyResponse>* writer) override {
    MyResponse response;
    for (int i = 0; i < 10; ++i) {
      response.set_data("Data " + std::to_string(i));
      writer->Write(response);
    }
    return Status::OK;
  }
};

// Client implementation
void MyClient::MyStreamingMethod() {
  MyRequest request;
  request.set_data("Hello");

  ClientContext context;
  std::unique_ptr<ClientReader<MyResponse>> reader(
      stub_->MyStreamingMethod(&context, request));

  MyResponse response;
  while (reader->Read(&response)) {
    // Process response.
    std::cout << response.data() << std::endl;
  }

  Status status = reader->Finish();
  if (status.ok()) {
    std::cout << "MyStreamingMethod succeeded." << std::endl;
  } else {
    std::cout << "MyStreamingMethod failed." << std::endl;
  }
}

在这个例子中,MyStreamingMethod是一个服务器端流式RPC,客户端发送一个MyRequest请求,然后读取一个流的MyResponse响应。服务器在接收到请求后,通过ServerWriter对象向客户端发送多个响应。

客户端向服务端发送请求后的回复,通常是通过返回一个Status对象来实现的。在上述例子中,MyStreamingMethod在完成所有响应发送后,返回一个Status::OK表示成功。客户端通过调用ClientReader::Finish方法来获取这个状态。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

相关推荐
pemper_9 分钟前
怎么操作使http变成https访问?
网络·网络协议·http·https·ssl
蒙奇·D·路飞-17 分钟前
古诗词四首鉴赏
网络
Run_Snails1 小时前
hcia-openEuler V1.0师资题库-试卷3
运维·服务器·网络
学java的小菜鸟啊1 小时前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
新手嵌入式学习2 小时前
网络协议头分析
网络·网络协议
运维Z叔3 小时前
云安全 | AWS S3存储桶安全设计缺陷分析
android·网络·网络协议·tcp/ip·安全·云计算·aws
weixin_456732593 小时前
网络-内核是如何与用户进程交互
网络·交互
陈大爷(有低保)4 小时前
UDP Socket聊天室(Java)
java·网络协议·udp
爱吃涮毛肚的肥肥(暂时吃不了版)4 小时前
计算机网络34——Windows内存管理
网络·计算机网络·udp
码哝小鱼5 小时前
firewalld封禁IP或IP段
linux·网络