xref: /aosp_15_r20/external/flatbuffers/grpc/samples/greeter/server.cpp (revision 890232f25432b36107d06881e0a25aaa6b473652)
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 
10 class GreeterServiceImpl final : public Greeter::Service {
SayHello(grpc::ServerContext * context,const flatbuffers::grpc::Message<HelloRequest> * request_msg,flatbuffers::grpc::Message<HelloReply> * response_msg)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 
SayManyHellos(grpc::ServerContext * context,const flatbuffers::grpc::Message<ManyHellosRequest> * request_msg,grpc::ServerWriter<flatbuffers::grpc::Message<HelloReply>> * writer)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 
RunServer()65 void 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 
main(int argc,const char * argv[])78 int main(int argc, const char *argv[]) {
79   RunServer();
80   return 0;
81 }
82