/// <summary>
    /// 任务进行
    /// </summary>
    /// <param name="obj"></param>
    private static void TaskRun(object obj)
    {
        HTTPParamIndie param = obj as HTTPParamIndie;

        try
        {
            var        datas       = HTTPRequest.Get(param);
            FileStream fileStream  = datas.Item1;
            Stream     stream      = datas.Item2;
            long       fileLength  = datas.Item3;
            long       totalLength = datas.Item4;

            param.FileLength  = fileLength;
            param.TotalLength = totalLength;

            if (fileStream == null || stream == null)
            {
                StopTask(param);
                return;
            }

            if (!HTTPRequest.MD5Verfied(param.MD5, stream))
            {
                param.MD5FailCallBack?.Invoke();
                return;
            }

            byte[] buff = new byte[4096];
            int    len  = -1;
            while ((len = stream.Read(buff, 0, buff.Length)) > 0)
            {
                fileStream.Write(buff, 0, len);
                param.FileLength += len;
            }

            param.SuccessCallBack?.Invoke();

            StopTask(param);
            ContinueTask();
        }
        catch (Exception e)
        {
            if (param.CurRetryTime < param.RetryTime)
            {
                StopTask(param);
                StartTask(param);
                param.CurRetryTime++;
            }
            param.FailCallBack?.Invoke();
        }
    }
    /// <summary>
    /// 开始任务
    /// </summary>
    /// <param name="param"></param>
    private static void StartTask(HTTPParamIndie param)
    {
        if (_lstThread.Count < MaxThread)
        {
            Thread t = new Thread(new ParameterizedThreadStart(TaskRun));
            param.RelateThread = t;

            t.Start(param);
            _lstThread.Add(t);
        }
        else
        {
            _queueParams.Enqueue(param);
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        //steam下载地址
        string url        = @"https://media.st.dl.eccdnx.com/client/installer/steam.dmg";
        string pathFormat = Application.dataPath + "/StreamingAssets/steam_{0}.dmg";

        //单个下载
        HTTPParamIndie paramIndie = new HTTPParamIndie(url, string.Format(pathFormat, 1), "", 1);

        indie = new HTTPDownloadIndie(paramIndie);
        indie.DownLoad();
        //----------

        ////批量下载
        List <string> urls  = new List <string>();
        List <string> paths = new List <string>();
        List <string> md5s  = new List <string>();

        for (int i = 2; i <= 40; i++)
        {
            urls.Add(url);
            paths.Add(string.Format(pathFormat, i));
            md5s.Add(i.ToString());
        }

        HTTPParamBatch paramBatch = new HTTPParamBatch();

        paramBatch.Urls      = urls;
        paramBatch.Paths     = paths;
        paramBatch.MD5S      = md5s;
        paramBatch.MaxThread = 10;

        batch = new HTTPDownloadBatch(paramBatch);
        batch.DownLoad();
        //--------------

        //信息打印
        t          = new Timer();
        t.Elapsed += timeCallBack;
        t.Interval = 1000;
        t.Start();
    }
    /// <summary>
    /// 初始化下载器
    /// </summary>
    private void SetDlders()
    {
        _dlders.Clear();
        int urlCnt         = _param.Urls.Count;
        int indieMaxThread = _param.MaxThread / urlCnt;

        indieMaxThread = Math.Max(indieMaxThread, 1);
        for (int i = 0; i < urlCnt; i++)
        {
            string url  = _param.Urls[i];
            string path = _param.Paths[i];
            string md5  = _param.MD5S[i];

            HTTPParamIndie indieParam = new HTTPParamIndie(url, path, md5, indieMaxThread);
            indieParam.TimeOut   = _param.TimeOut;
            indieParam.RetryTime = _param.RetryTime;

            HTTPDownloadIndie dlder = new HTTPDownloadIndie(indieParam);
            _dlders.Add(dlder);

            dlder.DownLoad();
        }
    }
 /// <summary>
 /// 添加任务
 /// </summary>
 /// <param name="param"></param>
 public static void AddTask(HTTPParamIndie param)
 {
     StartTask(param);
 }
 /// <summary>
 /// 停止任务,并检测下一个任务
 /// </summary>
 /// <param name="param"></param>
 private static void StopTask(HTTPParamIndie param)
 {
     _lstThread.Remove(param.RelateThread);
     ContinueTask();
     param.RelateThread.Abort();
 }
Exemple #7
0
    /// <summary>
    /// 根据参数获取返回数据
    /// </summary>
    /// <param name="param"></param>
    /// <returns></returns>
    public static (FileStream, Stream, long, long) Get(HTTPParamIndie param)
    {
        if (param == null)
        {
            return(GetDefaultReturn());
        }

        // 构建文件流
        FileStream fs = new FileStream(param.Path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        // 文件当前长度
        long fileLength  = fs.Length;
        long totalLength = 0;

        //设置当前文件数据位置
        fs.Seek(fileLength, SeekOrigin.Begin);

        // 发送请求开始下载
        HttpWebRequest request = WebRequest.Create(param.Url) as HttpWebRequest;

        if (request == null)
        {
            return(GetDefaultReturn());
        }

        request.Timeout = param.TimeOut;

        WebResponse response = request.GetResponse();

        if (response == null)
        {
            return(GetDefaultReturn());
        }

        //获取文件总大小
        totalLength = response.ContentLength;
        if (fileLength >= totalLength)
        {
            return(null, null, fileLength, totalLength);
        }

        request.AddRange(fs.Length);
        response = request.GetResponse();
        if (response == null)
        {
            return(GetDefaultReturn());
        }

        // 读取文件内容
        Stream stream = response.GetResponseStream();

        if (stream == null)
        {
            return(GetDefaultReturn());
        }

        if (stream.CanTimeout)
        {
            stream.ReadTimeout = param.TimeOut;
        }
        return(fs, stream, fileLength, totalLength);
    }