Bola mágica 8

Creación de una conexión HTTP2 entre un cliente Qt gRPC y un servidor C++ gRPC.

Magic 8 ball envía una pregunta a un servidor y muestra la respuesta recibida:

Ejemplo de bola 8 mágica

El código de ejemplo incluye los siguientes componentes:

  • magic8ball Aplicación cliente Qt gRPC que utiliza las funciones CMake qt_add_protobuf() y qt_add_grpc() para la generación de código Qt de mensajes y servicios.
  • server aplicación que llama al plugin C++ gRPC para generar código de servidor e implementar lógica de servidor simple.

Nota: necesitas tener instalado el plugin C++ gRPC. Encuentre los detalles aquí: Requisitos previos del módulo

Ambos componentes utilizan mensajes generados a partir del esquema protobuf descrito en el archivo exampleservice.proto:

syntax = "proto3";

package qtgrpc.examples;

message AnswerRequest {
    string question = 1;
}

message AnswerResponse {
    string message = 1;
}

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

El cliente gRPC se define como un objeto QML que está disponible después de compilar el código.

    ExampleServiceClient {
        id: grpcClient
        channel: grpcChannel.channel
    }

El servicio cliente se conecta a localhost con el puerto 50051, que se especifica en las opciones del canal gRPC:

    GrpcHttp2Channel {
        id: grpcChannel
        hostUri: "http://localhost:50051"
        // Optionally, you can specify custom channel options here
        // options: GrpcChannelOptions {}
    }

Y envía una petición a la parte servidor:

    function requestAnswer(question: string): void {
        ...
        root.answerReq.question = question;
        grpcClient.answerMethod(root.answerReq, finishCallback, errorCallback, grpcCallOptions);
    }

answerMethod es un método gRPC que el cliente llama. Tiene cuatro parámetros: el objeto de solicitud, una función de devolución de llamada de finalización, una función de devolución de llamada de error y un objeto GrpcCallOptions.

Haga clic en el botón Ask para enviar la solicitud al servidor magic8ball.

Nota: Debe ejecutar el servidor en paralelo con la aplicación cliente.

La aplicación server elige una respuesta aleatoria de la lista de respuestas y envía los datos al puerto del cliente. También comprueba que la solicitud contiene un campo no vacío question. Si el campo está vacío, devuelve un StatusCode::INVALID_ARGUMENT

    grpc::Status answerMethod(grpc::ServerContext *, const AnswerRequest *request,
                              AnswerResponse *response) override
    {
        if (request->question().empty()) {
            std::cerr << "Question is empty" << std::endl;
            return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "Question is empty");
        }
        std::cout << "Received question: " << request->question() << std::endl;

        response->set_message(getRandomAnswer());

        return grpc::Status();
    };

Tras recibir una respuesta, la aplicación cliente muestra la respuesta.

Proyecto de ejemplo @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.