按照 grpc-go 的文档,双向stream按如下的方式实现:
func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
for {
in, err := stream.Recv()
if err == io.EOF {
return nil
}
if err != nil {
return err
}
key := serialize(in.Location)
... // look for notes to be sent to client
for _, note := range s.routeNotes[key] {
if err := stream.Send(note); err != nil {
return err
}
}
}
}
我现在想加入超时的机制,如果客户端在一定时间(例如30秒)内没有发送任何数据,即这里的 stream.Recv
被阻塞超过30秒,就把 stream
关了。但是我没有在文档里找到任何关于这种操作的信息,请问我该如何解决这个问题?谢谢
对于ClientStream而言,可以通过context来使操作超时或被取消
但对于ServerStream 好像就只能return
我也正为这个而烦恼
这个stream不如net.Conn,后者可以close和SetDeadline