1. 相关结构体及函数声明
rpc FileUpload (stream FileRequest) returns(FileReply); message FileRequest { string FileName = 1; bytes FileContents = 2; } message FileReply { int32 ResultCode = 1; }
2. 函数实现
public override async Task<FileReply> FileUpload(IAsyncStreamReader<FileRequest> requestStream, ServerCallContext context) { string exePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; Directory.SetCurrentDirectory(exePath); var response = new FileReply(); try { int count = 0; BinaryWriter fileWriter = null; while (await requestStream.MoveNext()) { var activeRequest = requestStream.Current; if (count == 0) { fileWriter = new BinaryWriter(new FileStream(activeRequest.FileName + "_Received", FileMode.Create)); count++; } fileWriter.Write(activeRequest.FileContents.ToByteArray()); } fileWriter.Close(); response.ResultCode = 0; } catch (Exception e1) { Console.WriteLine(e1.Message); response.ResultCode = -1; } return response; }
3. 客户端调用
static async Task Main(string[] args) { try { if (args.Length == 0) { Console.WriteLine("没有指定要上传的文件名,操作中止!"); return; } string filePath = args[0]; const int ByteCount_OneSend = 1024 * 1024; var channel = GrpcChannel.ForAddress("http://172.22.113.93:5000"); var client = new Greeter.GreeterClient(channel); Console.WriteLine("开始上传:"); Console.WriteLine("文件名 = {0}", filePath); byte[] sendBytes = new byte[ByteCount_OneSend]; FileStream fs = File.OpenRead(filePath); using (var call = client.FileUpload()) { var requestStream = call.RequestStream; FileRequest request = new FileRequest(); request.FileName = filePath; int readCount = 0; do { readCount = fs.Read(sendBytes, 0, ByteCount_OneSend); if (readCount == 0) { break; } request.FileContents = ByteString.CopyFrom(sendBytes, 0, readCount); await requestStream.WriteAsync(request); Console.Write("."); } while (readCount > 0); fs.Close(); await call.RequestStream.CompleteAsync(); await call; } Console.WriteLine(" 上传成功。"); } catch (Exception e1) { Console.WriteLine(e1.Message); } finally { Console.WriteLine(" Press any key to exit..."); Console.ReadKey(); } }