Android 使用gRPC上传文件

环境配置

Android gRPC的使用-CSDN博客

一、rpc服务定义

添加一个UpLoadFile方法,参数为stream类型,必须有一个bytes类型的参数,其他参数可以根据需要自己添加。

syntax = "proto3";// 指定proto版本
package proto;     // 指定默认包名
import "google/protobuf/empty.proto";

option go_package = "./gen";

//定义rpc服务
service UserService {
  rpc UpLoadFile(stream UpLoadFileRequest) returns (UpLoadFileResponse){}
}

message UpLoadFileRequest{
  uint64 UploadID = 1;
  string FileName = 2;
  bytes content = 3;
}

message UpLoadFileResponse{
  uint32 code = 1;
  string message = 2;
  string data = 3;
}

二、具体实现

使用FileInputStream按字节流的方式读取文件,调用rpc中定义方法,将byte数据放入ByteString类型的参数中即可

package com.cn.grpc.client

import android.util.Log
import com.cn.grpc.InitApp
import com.google.protobuf.kotlin.toByteString
import io.grpc.ManagedChannel
import io.grpc.Metadata
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import proto.User.UpLoadFileRequest
import proto.UserServiceGrpcKt
import java.io.File
import java.io.FileInputStream

/**
 *    @Author : Cook
 *    @Date   : 2024/8/7
 *    @Desc   :
 *    @Version:
 */
class UserClient(private val channel: ManagedChannel) {
   private val token =""
    private val stub: UserServiceGrpcKt.UserServiceCoroutineStub by lazy {
        UserServiceGrpcKt.UserServiceCoroutineStub(channel)
    }


    suspend fun upload(): String {
        
        var uploadResult="error"
        try {

            val file = File("${InitApp.path}/Screenshot_20240913_220538.png")
            if (file.exists()) {
                val flow: Flow<UpLoadFileRequest> = flow {
                    val fileInputStream =
                        FileInputStream(file)
                    val bytes = ByteArray(fileInputStream.available())
                    fileInputStream.read(bytes)
                    val request =
                        UpLoadFileRequest.newBuilder().setContent(bytes.toByteString())
                            .setFileName("Screenshot_20240913_220538.png").setUploadID(1020)
                            .build()
                    emit(request)
                }
                    .flowOn(Dispatchers.IO)
                val repo = stub.upLoadFile(flow, Metadata().apply {
                    put(Metadata.Key.of("token", Metadata.ASCII_STRING_MARSHALLER), token)
                }
                )
                uploadResult="${repo.message}-${repo.data}"
                Log.e("UserClient", "result=${repo.message}")
            }
            
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return uploadResult

    }


}

Android使用 gRPC,您需要进行以下步骤: 1. 在您的 Android 项目中添加 gRPC 和 protobuf 的依赖项。您可以在项目的 build.gradle 文件中添加以下代码: ``` implementation 'io.grpc:grpc-okhttp:1.40.1' implementation 'io.grpc:grpc-protobuf-lite:1.40.1' implementation 'io.grpc:grpc-stub:1.40.1' implementation 'com.google.protobuf:protobuf-java:3.18.0' ``` 2. 定义您的 gRPC 服务和消息类型的.proto 文件。您可以使用 Protocol Buffers 语言来定义它们。例如,创建一个名为 "example.proto" 的文件,并在其中定义服务和消息类型。 示例 "example.proto" 文件内容: ```protobuf syntax = "proto3"; package com.example.grpc; service ExampleService { rpc ExampleMethod (ExampleRequest) returns (ExampleResponse) {} } message ExampleRequest { string message = 1; } message ExampleResponse { string reply = 1; } ``` 3. 在您的项目中运行 Protocol Buffers 编译器,以生成 Java 类。您可以使用 `protoc` 命令行工具或 Gradle 插件来完成此操作。例如,使用 Gradle 插件可以在项目的 build.gradle 文件中添加以下代码: ``` protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.18.0' } plugins { grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.40.1' } } generateProtoTasks { all()*.plugins { grpc {} } } } ``` 然后,在命令行中运行 `./gradlew generateProto` 命令,以生成 Java 类。 4. 创建 gRPC 客户端代码。您可以使用生成的 Java 类来创建客户端代码,并与 gRPC 服务进行通信。在您的 Android 项目中,您可以创建一个 gRPC 客户端类,以处理与服务器的通信。 示例 gRPC 客户端类: ```java import com.example.grpc.ExampleRequest; import com.example.grpc.ExampleResponse; import com.example.grpc.ExampleServiceGrpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.stub.StreamObserver; public class GrpcClient { private final ManagedChannel channel; private final ExampleServiceGrpc.ExampleServiceStub stub; public GrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() .build(); stub = ExampleServiceGrpc.newStub(channel); } public void callExampleMethod(String message, StreamObserver<ExampleResponse> responseObserver) { ExampleRequest request = ExampleRequest.newBuilder() .setMessage(message) .build(); stub.exampleMethod(request, responseObserver); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } } ``` 这是一个简单的示例,演示了如何创建 gRPC 客户端并调用服务的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值