如何保存GRPC流以进行娱乐

时间:2016-04-28 17:03:51

标签: 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 {}的任何内容(如上面代码中所述),但这并没有帮助,我不会想到,这可能是解决方案。

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

1 个答案:

答案 0 :(得分:0)

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

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

您的地图将如下所示:

type Server struct {
    ....
    conns map[string]Connection
}

您在最后创建流的RPC应该像这样:

conn := Connection{
    stream: stream,
    error:  make(chan error),
}
s.conns[initMessage.DeviceID] = conn

return <-conn.error

这样,您的信息流将在“活动”状态下存储在地图中。