我想在 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 循环?