• 网络编程 —— Http进度条


    第一种下载带进度的方法

    string url = "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi";

    1使用getASync获取服务器响应数据

    参数1请求的路径,
                参数2 HttpCompletionOption.ResponseHeadersRead 请求完成时候等待请求带什么程度才代表请求成功
                ResponseHeadersRead 读取到响应头的时候算是请求完成, 响应头有个字段可以获取资源大小
                ResponseContentRead 读取到整个响应内容算是请求完成

    HttpResponseMessage res = await new HttpClient().GetAsync(url,HttpCompletionOption.ResponseHeadersRead);
    2 获取url的文件名称
     string fileName = Path.GetFileName(url);
    3 将响应数据读取带stream对象中
    Stream stream =  await res.Content.ReadAsStreamAsync();
    4 记录响应数据的总大小 在响应头里面有一个ContentLength字段获取响应大小也就是下载的总大小
    long all =  res.Content.Headers.ContentLength ?? 0;
    6 定义一个字节数组 字节数组容量是8KB的大小
    byte[] bytes = new byte[1024*8];

               从数据流读取到字节数组,并且从0开始读取,到字节数组被容纳完为止
               返回值是整型的,代表是读取的位置
               stream.Read(bytes, 0, bytes.Length); 

    int nowReadCount = 0; //当前读取的位置

    如果读取的位置不为0,证明还有数据,还得再次读取数据

    1. while((nowReadCount = stream.Read(bytes, 0, bytes.Length))!=0)
    2. {
    3. // 读取数据
    4. //b把当前读取的数据写入本地
    5. fs.Write(bytes, 0, nowReadCount);
    6. loadByte += nowReadCount;// 记录总下载量
    7. Console.WriteLine(loadByte);
    8. //用已经下载量/总量 *100 转成百分制度。
    9. double progress = (double)loadByte /(double) all * 100;
    10. this.progressBar1.Value = (int)progress;
    11. }
    12. fs.Close();
    13. MessageBox.Show("下载完成");

    安装第三方,Microsoft.AspNet.WebApi.Client,
    提供了一个下载事件,在事件函数可以获取下载进度

    1创建httpclientHandler 事件对象
    HttpClientHandler handler = new HttpClientHandler();

    2 创建下载进度的事件对象

    ProgressMessageHandler pro = new ProgressMessageHandler(handler);

    3 创建下载进度的事件函数

     pro.HttpReceiveProgress += Pro_HttpReceiveProgress;

      Pro_HttpReceiveProgress类

    1. private void Pro_HttpReceiveProgress(object sender, HttpProgressEventArgs e)
    2. {
    3. Console.WriteLine(e.ProgressPercentage);//记录当前的进度
    4. //Invoke调用一个方法
    5. this.Invoke((Action) (() =>
    6. {
    7. this.progressBar1.Value = e.ProgressPercentage;
    8. }));
    9. }
    4 创建请求对象并且发请求,获取响应 目的是为了通知下载进度对象,再触发对应的Pro_HttpReceiveProgress函数
    1. HttpClient client = new HttpClient(pro);
    2. var res = await client.GetAsync("https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi");
    5 读取响应数据写入本地
    1. var stream = await res.Content.ReadAsStreamAsync();
    2. var fs = new FileStream("node.msi", FileMode.Create);
    3. fs.CopyTo(fs);
    4. fs.Close();
    5. stream.Close();

  • 相关阅读:
    ECharts的配置(一)
    Linux :realpath 命令
    Java高级---网络编程
    文盘 Rust -- tokio 绑定 cpu 实践
    14.4 Socket 双向数据通信
    水电站与数据可视化:洞察未来能源趋势的窗口
    垃圾收集器ParNew&CMS与底层三色标记算法
    Java读取文件的N种方法
    【C++】模版-初阶
    JavaScript 生成 16: 9 宽高比
  • 原文地址:https://blog.csdn.net/lu2023_8_6/article/details/139247445