zoukankan      html  css  js  c++  java
  • grpc 文件上传 C#

    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();
        }
    }
  • 相关阅读:
    ffmpeg给视频添加文本
    装饰器的补充以及迭代器
    闭包函数与装饰器
    函数的嵌套,名称空间,以及作用域
    函数一
    文件处理二
    字符编码及文本一
    基本数据类型及内置方法(二)
    基本数据类型的内置方法
    流程控制之if,while,for
  • 原文地址:https://www.cnblogs.com/dhqy/p/14372056.html
Copyright © 2011-2022 走看看