如何使用gRPC进行异步流传输?

时间:2019-02-09 11:07:23

标签: python dart flutter grpc grpc-python

我正在尝试使用带有gRPC api的dart(flutter)客户端和python服务器进行实时图像分析。如何在gRPC中使用dart-client设置异步图像流?(例如websockets)

2 个答案:

答案 0 :(得分:1)

这是一个很大的话题,但是您要求使用dart客户端,因此我假设您有一个看起来像this的“ .proto ”文件和一个有效的python-服务器。

如果要将dart-client连接到异步流,则必须像这样进行somithing。

  typedef FrameStreameCallback = Function(Frame);

  ResponseStream<Frame> _frameStream;
  void getFrames(FrameStreameCallback cb) {
    FrameRequest req = new FrameRequest();
    //Set data of req and so on...

    _frameStream =  _stub.FrameStreamer(req);

    _frameStream.listen((Frame newFrame) {
      //Send callback when a new Frame is received
      cb(newFrame);
    });
    _messageStream.handleError((onError) {
      print("An error occured in frame stream " + onError);
    });
  }

然后您像这样调用此方法:

obj.getFrames((Frame f){
  print("New Frame received" + f.toString());
});

答案 1 :(得分:0)

您的问题范围太大。您必须决定要流式传输的内容,是否要流式传输一个图像帧?请记住,如果您希望每条消息发送超过1MB的内存,则gRPC提倡重新设计系统或使用其他功能。

我对dart并不熟悉,但是假设您需要将图像流传输到运行dart的客户端,则可以让客户端向python服务器发送请求,然后让python服务器将帧流回。原型可能看起来像这样:

service FrameService {

  rpc FrameStreamer(FrameRequest) returns (stream Frame) {}

}

message FrameRequest {
    //empty
}

message Frame {
    //put your data in here, perhaps bytes?
    //or an frame id, etc.
}