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("\r\n上传成功。"); } catch (Exception e1) { Console.WriteLine(e1.Message); } finally { Console.WriteLine("\r\nPress any key to exit..."); Console.ReadKey(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗