grpc的使用、传输文件方法

入门:
https://leehao.me/gRPC-C-%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/

C++如何实现在gRPC中传输文件
https://www.cnblogs.com/xingmuxin/p/10738488.html

通过 SSH 在远程和本地系统之间传输文件的 4 种方法
https://blog.csdn.net/fuhanghang/article/details/134665553

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Android gRPC Java 传输文件的演示,其中包括客户端和服务器端的代码。 1. 客户端代码 ```java public class FileTransferClient { private ManagedChannel channel; private FileTransferServiceGrpc.FileTransferServiceBlockingStub blockingStub; public FileTransferClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() .build(); blockingStub = FileTransferServiceGrpc.newBlockingStub(channel); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } public void uploadFile(File file) { try { FileInputStream inputStream = new FileInputStream(file); StreamObserver<FileChunk> responseObserver = blockingStub.uploadFile(new StreamObserver<UploadStatus>() { @Override public void onNext(UploadStatus value) { Log.d("FileUpload", "Upload status: " + value.getStatus()); } @Override public void onError(Throwable t) { Log.e("FileUpload", "Upload error: " + t.getMessage()); } @Override public void onCompleted() { Log.d("FileUpload", "Upload completed"); } }); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { FileChunk fileChunk = FileChunk.newBuilder() .setData(ByteString.copyFrom(buffer, 0, bytesRead)) .build(); responseObserver.onNext(fileChunk); } responseObserver.onCompleted(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 2. 服务器端代码 ```java public class FileTransferServer { private static final Logger logger = Logger.getLogger(FileTransferServer.class.getName()); private Server server; public void start(int port) throws IOException { server = ServerBuilder.forPort(port) .addService(new FileTransferServiceImpl()) .build() .start(); logger.info("Server started, listening on " + port); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.err.println("*** Shutting down gRPC server since JVM is shutting down"); FileTransferServer.this.stop(); System.err.println("*** Server shut down"); } }); } private void stop() { if (server != null) { server.shutdown(); } } private void blockUntilShutdown() throws InterruptedException { if (server != null) { server.awaitTermination(); } } public static void main(String[] args) throws IOException, InterruptedException { final FileTransferServer server = new FileTransferServer(); server.start(50051); server.blockUntilShutdown(); } static class FileTransferServiceImpl extends FileTransferServiceGrpc.FileTransferServiceImplBase { private FileOutputStream outputStream; @Override public StreamObserver<FileChunk> uploadFile(StreamObserver<UploadStatus> responseObserver) { outputStream = null; try { outputStream = new FileOutputStream("path_to_save_file"); // 修改为你想要保存文件的路径 } catch (FileNotFoundException e) { e.printStackTrace(); } return new StreamObserver<FileChunk>() { @Override public void onNext(FileChunk value) { try { outputStream.write(value.getData().toByteArray()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable t) { t.printStackTrace(); } @Override public void onCompleted() { try { outputStream.flush(); outputStream.close(); UploadStatus uploadStatus = UploadStatus.newBuilder() .setStatus("Success") .build(); responseObserver.onNext(uploadStatus); responseObserver.onCompleted(); } catch (IOException e) { e.printStackTrace(); } } }; } } } ``` 这个示例演示了如何使用 gRPC 在 Android 上上传文件。在客户端代码中,我们创建了一个 `FileTransferClient` 类,它包含了与服务器通信的代码。在服务器端代码中,我们创建了一个 `FileTransferServer` 类,它包含了接收上传文件的代码。文件被分成块,并逐个发送到服务器。在服务器端,每个块被写入文件,直到接收到所有的块。在客户端,我们会收到上传的状态,包括上传是否成功以及错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值