...

Text file src/github.com/google/flatbuffers/grpc/samples/greeter/server.cpp

Documentation: github.com/google/flatbuffers/grpc/samples/greeter

     1#include "greeter.grpc.fb.h"
     2#include "greeter_generated.h"
     3
     4#include <grpcpp/grpcpp.h>
     5
     6#include <iostream>
     7#include <memory>
     8#include <string>
     9
    10class GreeterServiceImpl final : public Greeter::Service {
    11  virtual grpc::Status SayHello(
    12      grpc::ServerContext *context,
    13      const flatbuffers::grpc::Message<HelloRequest> *request_msg,
    14      flatbuffers::grpc::Message<HelloReply> *response_msg) override {
    15    flatbuffers::grpc::MessageBuilder mb_;
    16
    17    // We call GetRoot to "parse" the message. Verification is already
    18    // performed by default. See the notes below for more details.
    19    const HelloRequest *request = request_msg->GetRoot();
    20
    21    // Fields are retrieved as usual with FlatBuffers
    22    const std::string &name = request->name()->str();
    23
    24    // `flatbuffers::grpc::MessageBuilder` is a `FlatBufferBuilder` with a
    25    // special allocator for efficient gRPC buffer transfer, but otherwise
    26    // usage is the same as usual.
    27    auto msg_offset = mb_.CreateString("Hello, " + name);
    28    auto hello_offset = CreateHelloReply(mb_, msg_offset);
    29    mb_.Finish(hello_offset);
    30
    31    // The `ReleaseMessage<T>()` function detaches the message from the
    32    // builder, so we can transfer the resopnse to gRPC while simultaneously
    33    // detaching that memory buffer from the builer.
    34    *response_msg = mb_.ReleaseMessage<HelloReply>();
    35    assert(response_msg->Verify());
    36
    37    // Return an OK status.
    38    return grpc::Status::OK;
    39  }
    40
    41  virtual grpc::Status SayManyHellos(
    42      grpc::ServerContext *context,
    43      const flatbuffers::grpc::Message<ManyHellosRequest> *request_msg,
    44      grpc::ServerWriter<flatbuffers::grpc::Message<HelloReply>> *writer)
    45      override {
    46    // The streaming usage below is simply a combination of standard gRPC
    47    // streaming with the FlatBuffers usage shown above.
    48    const ManyHellosRequest *request = request_msg->GetRoot();
    49    const std::string &name = request->name()->str();
    50    int num_greetings = request->num_greetings();
    51
    52    for (int i = 0; i < num_greetings; i++) {
    53      auto msg_offset = mb_.CreateString("Many hellos, " + name);
    54      auto hello_offset = CreateHelloReply(mb_, msg_offset);
    55      mb_.Finish(hello_offset);
    56      writer->Write(mb_.ReleaseMessage<HelloReply>());
    57    }
    58
    59    return grpc::Status::OK;
    60  }
    61
    62  flatbuffers::grpc::MessageBuilder mb_;
    63};
    64
    65void RunServer() {
    66  std::string server_address("0.0.0.0:50051");
    67  GreeterServiceImpl service;
    68
    69  grpc::ServerBuilder builder;
    70  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    71  builder.RegisterService(&service);
    72  std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
    73  std::cerr << "Server listening on " << server_address << std::endl;
    74
    75  server->Wait();
    76}
    77
    78int main(int argc, const char *argv[]) {
    79  RunServer();
    80  return 0;
    81}

View as plain text