我有一个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
错误以外的内容?我应该将此报告为错误吗?
任何帮助表示赞赏!谢谢!
答案 0 :(得分:0)
我不熟悉Go,但我知道c ++层。你能用GRPC_VERBOSITY = debug和GRPC_TRACE = api运行客户端吗?这样可以更深入地了解问题。