Magic 8 Ball▲
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.
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 binds on the localhost with port 50051:
QUrl url("http://localhost:50051"
, QUrl::
StrictMode);
m_client-&
gt;attachChannel(std::
make_shared&
lt;QGrpcHttp2Channel&
gt;(url,
QGrpcInsecureChannelCredentials()
|
QGrpcInsecureCallCredentials()));
And sends a request to the server part:
void
ClientService::
sendRequest()
{
// clean error on UI before new request
emit errorRecieved(""
);
AnswerRequest request;
request.setMessage("sleep"
);
m_client-&
gt;answerMethod(request, m_response.get());
}
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-&
gt;message() ==
"sleep"
)
QThread::
msleep(2000
);
response-&
gt;set_message(std::
string(answers[generateRandomIndex()]));
return
Status();
}
After receiving a response the client application shows the answer.