/// <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(); }
/// <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); }