如何从流服务器接收消息?

Posted

技术标签:

【中文标题】如何从流服务器接收消息?【英文标题】:How to receive messages from a streaming server? 【发布时间】:2019-11-08 08:56:49 【问题描述】:

我正在尝试构建一个异步 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;
;

我需要在receiveFromServer()函数中实现步骤1和2。

【问题讨论】:

【参考方案1】:

幸运的是,我找到了解决问题的方法,并且我的项目中的异步双向流现在可以按预期工作。 原来我对“完成队列”概念的理解是不正确的。 这个example对我帮助很大!

【讨论】:

以上是关于如何从流服务器接收消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的流中接收数据(swift)

当有多个服务器广播时,客户端如何接收多个广播消息?

将数据从流分析提取到 Azure 机器学习

在微服务的发布/订阅模型中,每个服务类型如何只接收/消费一次消息

如何在套接字上不断接收用户的消息?

如何在 xmpphp 中接收消息