Go语言 流服务器错误:rpc错误:code = Unavailable desc = transport is closing”

dbf7pr2w  于 2023-06-18  发布在  Go
关注(0)|答案(2)|浏览(863)

我有一个带有gRPC流的服务器。在一个客户端(之前订阅了该流)取消订阅后,我得到了这个错误rpc error: code = Unavailable desc = transport is closing
在我启用了更详细的日志之后,我看到了这个警告grpc: Server.Serve failed to create ServerTransport: connection error: desc = "transport: http2Server.HandleStreams failed to receive the preface from client: EOF",并且每秒都会收到几次。有什么问题?
客户端

stream, err := s.stream.GetStreamClient(metadata.AppendToOutgoingContext(ctx,"key","value"),&sub.StreamRequest{})
for {
   resp, err := stream.Recv()
   if err != nil {
       stream.CloseSend()
       return
}
....
}

客户端也可以在超时后调用stream.CloseSend()
服务器

GetStreamClient(req *sub.StreamRequest, stream pb.StreamClient) error { 
for {
    err := stream.Send()
    if err != nil {
    //log error
    return
    }
  }
}
dw1jzc5e

dw1jzc5e1#

欢迎来到StackOverflow。
我有这个错误很多次,每次这个错误是关于clientserver中生成的proto的差异
例如:假设您更改了以下消息:

message example {
string var1 = 1;
string var2 = 2;
}

致:

message example{
string var1 = 1;
int64 var2 = 2;
}

你忘了重新生成客户端原始代码。则客户端希望将var2作为字符串发送。但是你的服务器端预期为int64,那么你的服务器出现了panic错误,将被关闭。

yjghlzjz

yjghlzjz2#

这是一个有点晚,相当随机拍摄:我也遇到了类似的问题,结果发现在某个时候我在内部无限循环,这使得连接没有真正关闭。
我使用的是另一个版本的grpc,所以我只能在这里猜测。但是您的代码表明,服务器只会在error的情况下离开它的无限循环。您是否检查过关闭流实际上会导致该错误?

相关问题