C# 多线程下载

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Threading;
using System.Net;
using System.IO;

namespace WebAppTest
{
    public partial class download : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //断点下载大文件
            //原理:使用多个线程将一个文件分成多个文件进行下载
            MutilDownload();
        }

        public void MutilDownload()
        {
            int threadcount = 3;
            int threadCompleteNum = 0;

            string[] files = new string[threadcount];
            int total = (int)GetDownloadFileSize();

            int per = total / threadcount;

            for (int i = 1; i <= threadcount; i++)
            {

                int from = (i - 1) * per+1;
                int to = i * per;
                if (i == 1)
                {
                    from = 0;
                }

                if (i == threadcount)
                {
                    to = total;
                }

                string path = Server.MapPath("~/resource/video/");

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                int index = i;

                Thread thread = new Thread(() =>
                {

                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://192.168.1.100:106/test/test.avi");

                    request.Method = "get";

                    request.AddRange(from, to);

                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                    string filename = path + index + ".avi";

                    files[index-1] = filename;

                    using (FileStream fs = new FileStream(filename, FileMode.CreateNew))
                    {
                        byte[] buffer = new byte[5 * 1024 * 1024];
                        int r;

                        using (Stream stream = response.GetResponseStream())
                        {
                            while ((r = stream.Read(buffer, 0, buffer.Length)) != 0)
                            {

                                fs.Write(buffer, 0, r);

                            }
                        }

                    }

                    threadCompleteNum++;

                    if (threadCompleteNum == threadcount)
                    {
                        //和并临时文件
                        string allFilename = path + "all.avi";

                        using (FileStream allFile = new FileStream(allFilename, FileMode.CreateNew))
                        {

                            for (int j = 0; j < files.Length; j++)
                            {
                                using (FileStream tempFile = new FileStream(files[j], FileMode.Open))
                                {
                                    byte[] tempBuffer = new byte[5 * 1024 * 1024];
                                    int t;

                                    while ((t = tempFile.Read(tempBuffer, 0, tempBuffer.Length)) != 0)
                                    {
                                        allFile.Write(tempBuffer, 0, t);
                                    }

                                }

                            }
                        }

                        //删除临时文件
                        foreach (var f in files)
                        {
                            if (File.Exists(f))
                            {
                                File.Delete(f);
                            }
                        }

                    }

                });

                thread.IsBackground = true;

                thread.Start();

            }

        }

        //获取下载文件大小
        public long GetDownloadFileSize()
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://192.168.1.100:106/test/test.avi");

            request.Method = "get";

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            return response.ContentLength;
        }
    }
}
时间: 2024-08-10 18:59:27

C# 多线程下载的相关文章

linux下多线程下载工具axel的编译安装

axel 是Linux 命令行下多线程的下载工具,支持断点续传,速度通常情况下是Wget的几倍 官方主页:http://axel.alioth.debian.org/ 源码下载: #curl -O http://pkgs.fedoraproject.org/repo/pkgs/axel/axel2.4.tar.gz/a2a762fce0c96781965c8f9786a3d09d/axel-2.4.tar.gz 编译安装: # tar -xvf axel-2.4.tar.gz  && cd

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

【幻化万千戏红尘】qianfengDay27-HttpURLConnection,OkHttpClient,,多线程下载且断点续传基础学习:

课程回顾: Servlet:java语言开发的运行在服务器上的开发步骤:1.创建Servlet类2.重写doGet或doPost方法3.运行在服务器 生命周期:1.初始化2.服务3.销毁 URL:统一资源定位符,网址openConnection 今日内容:Http协议:超文本传输协议常用方式:1.HttpURLConnection2.okHttp HttpURLConnection的使用步骤:1.创建URL对象---URL url=new URL("网址");2.获取连接对象--Htt

java多线程下载

多线程下载是通过占有服务器资源来提高速度的.每个线程应该下载一个文件的不同位置,假如现在有一个长度为10的资源,有三个线程,那么第一个线程下载的长度为012,第二个为345,第四个为6789所以问题来了每个线程下载的长度是多少呢?线程的id为0,1,2每个线程下载的数量=总长度/线程数量size=10/3start:id*sizeend:(id+1)*size-1最后一个线程的结束位置为:总长度-1 package down; import java.io.File; import java.i

J哥---------Android 多线程下载 仿下载助手(改进版)

首先声明一点: 这里的多线程下载 并不是指的 多个线程下载一个 文件,而是 每个线程 负责一个文件.真正的多线程 希望后面能给大家带来.  -------------  欢迎 爱学习的小伙伴 加群  -------------  -------------android交流群:230274309------------- -------------一起分享,一起进步!  需要你们-------------- --------------  期待各位爱学习的小伙伴们 的到来------------

Android之——多线程下载示例(一)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载,Android API中明确要求将耗时的操作放到一个子线程中执行,文件的下载无疑是需要耗费时间的,所以要将文件的下载放到子线程中执行.下面,我们一起来实现一个Android中利用多线程下载文件的小例子. 二.服务端准备 在这个小例子中我以下载有道词典为例,在网上下载有道词典的安装包,在eclipse中新建项目web,将下载的

java实现多线程下载

本篇博客可认为是对 使用java实现http多线程下载 一文的再次解读. 首先,从宏观来说 java实现多线程下载这个功能的实现由以下几部分组成: 1 建立多个线程去分别下载文件的一部分. 2 将多个线程下载的文件(还在内存中),写入硬盘中的一个文件. 3 断点续传 GET /Path/FileName HTTP/1.0 Host: www.server.com:80 Accept: */* User-Agent: GeneralDownloadApplication Connection: c

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

Android版多线程下载器核心代码分享

首先给大家分享多线程下载核心类: 1 package com.example.urltest; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.RandomAccessFile; 6 import java.net.HttpURLConnection; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 im

Android 之多线程下载原理

在Android之中呢,对于多线程的操作很是平凡,所以对于多线程的理解越深,那么对于自己的程序便能够很好的运行 这也是对于Android开发是一个重要的知识点,那么我们现在来了解多线程的下载原理. android 多线程下载 多线程下载步骤: 1.本地创建一个跟服务器一样的大小一样的文件 临时文件. 2.计算分配几个线程去下载服务器上的资源 每个文件下载的位置. 3.开启线程,每一个线程下载对应的文件. 4.如果所有的线程都把自己的数据下载完成了,服务器上的资源就被下载到本地了 如图所示:(假设