Как получать сообщения с потокового сервера? - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь создать асинхронный клиент gRPC C ++, который отправляет / получает потоковые сообщения на сервер и с сервера, используя экземпляр ClientAsyncReaderWriter. Клиент и сервер отправляют сообщения друг другу, когда захотят. Как я могу проверить, есть ли какое-либо сообщение с сервера?

Экземпляр ClientAsyncReaderWriter имеет привязанную очередь завершения. Я попытался проверить очередь завершения, вызвав функции Next() и AsyncNext(), чтобы выяснить, есть ли какое-либо событие, которое указывало бы на наличие какого-либо сообщения от сервера. Однако в очереди завершения нет событий, даже если есть сообщение от сервера.

class AsyncClient {
public:
    AsyncClient(std::shared_ptr<grpc::Channel> channel) :
        stub_(MyService::NewStub(channel)),
        stream(stub_->AsyncStreamingRPC(&context, &cq, (void *)1))
    {}
    ~AsyncClient()
    {}

    void receiveFromServer() {
        StreamingResponse response;

        // 1. Check if there is any message
        // 2. Read the message
    }

private:
    grpc::ClientContext context;
    grpc::CompletionQueue cq;
    std::shared_ptr<MyService::Stub> stub_;
    std::shared_ptr<grpc::ClientAsyncReaderWriter<StreamingRequest, StreamingResponse>> stream;
};

Мне нужно реализовать шаги 1 и 2 в функции receiveFromServer().

1 Ответ

0 голосов
/ 11 ноября 2019

К счастью, я нашел решение своей проблемы, и асинхронная двунаправленная потоковая передача в моем проекте теперь работает, как и ожидалось. Оказалось, что мое понимание концепции «очереди завершения» было неверным. Этот пример мне очень помог!

...