go - 如何保存 GRPC 流以供重用

标签 go protocol-buffers grpc

我有一个 GRPC 服务器,它提供一个函数并返回一个流。
我想将流保存到 map[string]grpc.Stream - 到目前为止这有效。

我的问题是在返回流的函数完成其逻辑后流被关闭。

这是,我到目前为止:

func (s *server) CheckConnection(initMessage *LighterGRPC.InitMessage, stream LighterGRPC.Lighter_CheckConnectionServer) error {
    //Do something magic
    streams[initMessage.DeviceID] = stream

    error := stream.Send(&LighterGRPC.ColorMessage{DATA})
    if error {
        log.Println(error)
    }

    //Tried
    //for { }

    return error
}

我已经尝试让函数永远不会返回任何带有 for {} 的东西在返回之前(如上面的代码中所评论),但这并没有帮助,我不认为这可能是解决方案。

有没有办法让流保持打开状态,以便我可以稍后在运行时通过它向客户端发送数据?

最佳答案

对于那些可能遇到同样问题的人,这里是快速解决方案。基本上,您需要将流包装在一个结构中,以便出现错误 chan。 Return 将阻塞,直到执行 stream.Send() 时发生错误

type Connection struct {
    stream LighterGRPC.Lighter_CheckConnectionServer
    error  chan error
}

您的 map 将类似于:
type Server struct {
    ....
    conns map[string]Connection
}

最后创建流的 RPC 应该是这样的:
conn := Connection{
    stream: stream,
    error:  make(chan error),
}
s.conns[initMessage.DeviceID] = conn

return <-conn.error

这样,您的流将在“事件”时存储在 map 中。

关于go - 如何保存 GRPC 流以供重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921131/

相关文章:

go - 防止 Go 的 json.Marshal 将字符串强制转换为有效的 UTF-8 unicode?

java - 将 protobuf 从 C++ 发送到 Java

c++ - 通过引用或指针返回并检查是否为空?

protocol-buffers - grpc:如何返回对另一个服务的引用

c# - Grpc 完全异步

go - Go中没有符号表?

go - 如何构建 go 命令的内部结构

go - go 中的 reflect.ValueOf() 和 Value.Elem() 有什么区别?

python - 存储为 Oracle BLOB : python retrieve fails 的 Protocol Buffer

docker - 在GCE VM上的Docker容器中的Node中编写的GRPC服务器-错误14