Magischer 8-Ball

Erstellen einer HTTP2-Verbindung zwischen einem Qt gRPC Client und einem C++ gRPC Server.

Magic 8 Ball sendet eine Frage an einen Server und zeigt die erhaltene Antwort an:

"Magic 8 ball example screenshot"

Der Beispielcode enthält die folgenden Komponenten:

  • magic8ball Qt gRPC Client-Anwendung, die die CMake-Funktionen qt_add_protobuf() und qt_add_grpc() für die Erzeugung von Qt-Code für Nachrichten und Dienste verwendet.
  • server Anwendung, die das C++ gRPC Plugin aufruft, um Servercode zu erzeugen und einfache Serverlogik zu implementieren.

Hinweis: Sie müssen das C++ gRPC Plugin installiert haben. Details finden Sie hier: Voraussetzungen für das Modul

Beide Komponenten verwenden generierte Nachrichten aus dem Protobuf-Schema, das in der Datei exampleservice.proto beschrieben ist:

syntax = "proto3";

package qtgrpc.examples;

message AnswerRequest {
    string question = 1;
}

message AnswerResponse {
    string message = 1;
}

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

Der gRPC -Client ist als QML-Objekt definiert , das nach dem Kompilieren des Codes verfügbar ist.

    ExampleServiceClient {
        id: grpcClient
        channel: grpcChannel.channel
    }

Der Client-Dienst verbindet sich mit localhost über den Port 50051, der in den Kanaloptionen von gRPC angegeben ist:

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

Und sendet eine Anfrage an den Serverteil:

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

answerMethod ist eine gRPC Methode, die der Client aufruft. Sie hat vier Parameter: das Request-Objekt, eine Finish-Callback-Funktion, eine Error-Callback-Funktion und ein GrpcCallOptions -Objekt.

Klicken Sie auf die Schaltfläche Ask, um die Anfrage an den magic8ball-Server zu senden.

Hinweis: Sie müssen den Server parallel zur Client-Anwendung laufen lassen.

Die Anwendung server wählt eine zufällige Antwort aus der Liste der Antworten aus und sendet die Daten an den Port des Clients. Sie prüft auch, ob die Anfrage ein nicht leeres Feld question enthält. Ist das Feld leer, gibt sie ein 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();
    };

Nach dem Empfang einer Antwort zeigt die Client-Anwendung die Antwort an.

Beispielprojekt @ code.qt.io

© 2025 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.