为什么在客户端完成流式处理后 gRPC 服务器端卡住了(客户端和服务器都用 dart 编写)?

问题描述 投票:0回答:0

我想在 gRPC 中将图像从客户端上传到服务器。为此,我创建了以下原型文件:

syntax = "proto3";

service EshopService {
    rpc UploadImage (stream ImageToUpload) returns (ImageLink);

}

message ImageToUpload {
    bytes image = 1;
}
message ImageLink {
    string image_links = 1;
}

在客户端为了流式传输图像我写了下面的代码:

 Future<ImageLink> uploadImage(ImageToUpload image) async {
    return await stub.uploadImage(streamImage(images.image));

  }

  Stream<ImageToUpload> streamImage(List<int> image) async* {
    for (var element in image) {
      yield ImageToUpload(image: [element]);
    }
  }

然后在服务器端我有以下代码:

 Future<ImageLink> uploadImage(grpc.ServiceCall call, Stream<ImageToUpload> request) async {
    print('uploading');
    final List<int> image = [];
    await for (var bytes in request) {
      image.addAll(bytes.image);
    }
    print('image gotten');
    File imageFile = File('image.jpg');
    await imageFile.writeAsBytes(image);
    return ImageLinks(imageLinks: 'image');
  }
}

图像被发送到服务器并被接收(我知道是因为我把它打印出来了),但是服务器永远不会离开

await for
部分。即使在流完成后它仍然卡在那里,并且在客户端我在一段时间后收到以下错误

 gRPC Error (code: 4, codeName: DEADLINE_EXCEEDED, message: Deadline exceeded, details: null, rawResponse: null, trailers: {})

如何让服务器知道流已完成,以便它脱离 for 循环?

flutter dart streaming grpc grpc-dart
© www.soinside.com 2019 - 2024. All rights reserved.