Magic 8 Ball

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

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

Beispiel-Screenshot des „Magic 8 Ball“

Der Beispielcode umfasst die folgenden Komponenten:

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

Hinweis: Das C++- gRPC -Pluginmuss installiertsein . Details findenSie hier: Modulvoraussetzungen

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 der Kompilierung des Codes verfügbar ist.

    ExampleServiceClient {
        id: grpcClient
        channel: grpcChannel.channel
    }

Der Client-Dienst stellt über den Port 50051 eine Verbindung zur „ localhost “ her, 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 Methode von „ gRPC “, die der Client aufruft. Sie hat vier Parameter: das Anfragedobjekt, eine Callback-Funktion für den Abschluss, eine Callback-Funktion für Fehler 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 ausführen.

Die Anwendung „ server “ wählt eine zufällige Antwort aus der Liste der Antworten aus und sendet die Daten an den Port des Clients. Außerdem prüft sie, ob die Anfrage ein nicht leeres Feld „ question “ enthält. Ist das Feld leer, gibt sie einen 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 Erhalt einer Antwort zeigt die Client-Anwendung die Antwort an.

Beispielprojekt @ 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.