环境配置
一、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
}
}