Magic 8 Ball

Creating a HTTP2 connection between a Qt GRPC client and a C++ gRPC server.

Magic 8 ball shows an answer it receives from a server:

Magic 8 ball has the following components:

  • magic8ball Qt GRPC client application that includes the qt_add_protobuf() and qt_add_grpc() CMake functions for message and service Qt code generation.
  • SimpleGrpcServer application that calls C++ gRPC plugin for generating server code and implementing simple server logic.

Note: you need the C++ gRPC plugin installed. Find details here: Module prerequisites

Both components use generated messages from the protobuf schema described in the exampleservice.proto file:

 syntax = "proto3";

 package qtgrpc.examples;

 message AnswerRequest {
     string message = 1;
 }

 message AnswerResponse {
     string message = 1;
 }

 service ExampleService {
     rpc answerMethod(AnswerRequest) returns (AnswerResponse) {}
 }

The client application connects to the localhost with port 50051:

         id: grpcChannel
         hostUri: "http://localhost:50051"

And sends a request to the server part:

     function sendRequest()
     {
         grpcClient.answerMethod(_answerReq, setResponse, errorCallback)
     }

Click the Ask question button to send the request to the SimpleGrpcServer application.

The SimpleGrpcServer application chooses a random answer from the list of answers and sends the data to the client's port.

 Status ExampleServiceServiceImpl::answerMethod(grpc::ServerContext *,
                                                const AnswerRequest *request,
                                                AnswerResponse *response)
 {
     if (request->message() == "sleep")
         QThread::msleep(2000);

     response->set_message(std::string(answers[generateRandomIndex()]));
     return Status();
 }

After receiving a response the client application shows the answer.

Example project @ code.qt.io