我有一个C++ gRPC客户端和Golang gRPC服务器。对于双向流,当客户端想关闭流时,它将永远阻止对Finish()的调用。
只有当存在没有错误,即服务器rpc函数返回nil时,才会发生这种情况。如果服务器是用C++编写的,我知道它会返回Status::Ok。
如果Golang服务器返回一个非零错误,那么Finish()函数将按预期返回。只有在没有错误的情况下才会出现问题。
示例:
.proto
service StreamTest {
rpc Get(stream StreamCommand) returns (stream Result) {}
}
message StreamCommand{
string cmd = 1;
}
message Result {
string res = 1;
}.cpp
std::unique_ptr<ClientReaderWriter<StreamCommand, Result>> readerWriter;
bool Get(Result &res) {
return readerWriter->Read(&res);
}
bool CloseClient() {
StreamCommand cmd;
cmd.set_cmd("stop");
readerWriter->Write(cmd);
readerWriter->WritesDone();
Status status = readerWriter->Finish(); // <------ BLOCKING
return status.ok();
}我已经用Golang gRPC客户端测试了服务器,它运行得很好。服务器应该返回nil错误以外的其他内容吗?我应该把这个报告为窃听器吗?
任何帮助都是非常感谢的!谢谢!
发布于 2018-03-01 16:14:04
我不熟悉Go,但我知道c++层。你能用GRPC_VERBOSITY=debug和GRPC_TRACE=api运行客户端吗?这将使我们对这个问题有更深入的了解。
https://stackoverflow.com/questions/48919324
复制相似问题