如何从流媒体服务器接收消息?
How to receive messages from a streaming server?
我正在尝试构建一个异步 gRPC C++ 客户端,该客户端使用 ClientAsyncReaderWriter
实例 sends/receives 流式传输消息 to/from 服务器。客户端和服务器随时向对方发送消息。如何查看服务器是否有消息?
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。
幸运的是,我找到了解决我的问题的方法,我项目中的异步双向流现在按预期工作。
原来我对"completion queue"这个概念的理解是错误的。
这个example对我帮助很大!
我正在尝试构建一个异步 gRPC C++ 客户端,该客户端使用 ClientAsyncReaderWriter
实例 sends/receives 流式传输消息 to/from 服务器。客户端和服务器随时向对方发送消息。如何查看服务器是否有消息?
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。
幸运的是,我找到了解决我的问题的方法,我项目中的异步双向流现在按预期工作。 原来我对"completion queue"这个概念的理解是错误的。 这个example对我帮助很大!