问题描述
Go和GRPC都是个新手,所以请忍受。
使用go版本go1.14.4 Windows / amd64,proto3和最新的grpc(我认为是1.31)。我正在尝试建立一个比迪流传输连接,该连接可能会打开更长的时间。一切都在本地工作,除非我终止客户端(或其中一个客户端),它也会杀死服务器,并出现以下错误:
无法交易数据rpc错误:代码=取消desc =上下文已取消
此错误来自此代码服务器端
func (s *exchangeserver) Trade(stream proto.ExchageService_TradeServer) error {
endchan := make(chan int)
defer close(endchan)
go func() {
for {
req,err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
log.Fatal("Unable to trade data ",err)
break
}
fmt.Println("Got ",req.GetNumber())
}
endchan <- 1
}()
go func() {
for {
resp := &proto.WordResponse{Word: "Hello again "}
err := stream.Send(resp)
if err != nil {
log.Fatal("Unable to send from server ",err)
break
}
time.Sleep(time.Duration(500 * time.Millisecond))
}
endchan <- 1
}()
<-endchan
return nil
}
Trade()RPC非常简单,因此不值得发布.proto。 该错误显然是从Recv()调用中发出的,但是该调用会阻塞,直到它看到一条消息,例如客户端断开连接,这时我希望它杀死流,而不是整个进程。我试过用HandleConn(context,stats.ConnStats)添加一个服务处理程序,它确实在服务器死掉之前捕获了断开连接,但是我不能做任何事情。我什至尝试创建一个全局通道,在调用HandleRPC(context,stats.RPCStats)时,服务处理程序将值推入该通道,并且仅允许在通道中有值的情况下调用Recv(),但不能是的,这就像为了安全起见阻止了阻止功能,反正还是行不通。
这必须是初学者犯下的那些真正愚蠢的错误之一。如果GPRC无法处理不中断的客户端断开连接,它将有什么用?但是我已经从互联网的各个角落阅读了大约一万亿(ish)的帖子,而没有其他人遇到这个问题。相反,此问题的比较流行的版本是“断开连接后,我的客户端流保持打开状态”。我希望那个问题。不是这个。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)