private Task OnRequestAssetBundleComplete(UnityWebRequest request, float startTime, string saveFileFullPath, HttpCallback callback, string matchMd5 = null) { Dictionary <string, object> dict = new Dictionary <string, object>(); int respCode = (int)request.responseCode; dict.Add("status", respCode); bool succeed = !request.isHttpError && !request.isNetworkError; if (succeed) //success and save assetBundle to disk. { float endTime = Time.realtimeSinceStartup; ulong size = request.downloadedBytes; float speed = size / (endTime - startTime); dict.Add("size", size); dict.Add("speed", speed); string data = ""; // get assetBundle bytes byte[] downloadBytes = request.downloadHandler.data; // compare md5 if (matchMd5 != null && StringUtils.BytesToMD5(downloadBytes) != matchMd5) { data = string.Format("{{\"code\":5,\"message\":\"{0}\"}}", "assetBundle md5 not match"); dict.Add("data", data); } else { data = "ok"; dict.Add("data", data); AssetBundle assetBundle = AssetBundle.LoadFromMemory(downloadBytes); dict.Add("assetBundle", assetBundle); // save assetBundle to disk. Task threadTask = new Task((bytes) => { SaveFile(saveFileFullPath, (byte[])bytes); }, downloadBytes); lock ( _ioTaskList ) { IOTask newTask = new IOTask(); newTask.threadTask = threadTask; newTask.callback = (status) => { if (status != IOTask.RESULT_SUCCESS) { StringBuilder sb = new StringBuilder(); foreach (var ex in threadTask.Exception.InnerExceptions) { sb.Append(ex.Message); sb.Append("\n"); } Debug.LogError(sb.ToString()); } }; _ioTaskList.Add(newTask); } // no need to wait after assetBundle is saved to disk. callback(dict); DisposeWebRequesat(request); return(threadTask); } } else { if (request.error != null) { dict.Add("data", request.error); } else { dict.Add("data", "request error, respCode: " + respCode.ToString()); } } callback(dict); DisposeWebRequesat(request); return(null); }
public void UploadFile(string url, string fullFilePath, bool needUnZip, int timeout, HttpCallback callback) { if (!File.Exists(fullFilePath)) { Dictionary <string, object> dict = new Dictionary <string, object>(); dict.Add("data", "file not exists !"); dict.Add("status", IO_RESULT_FAIL); callback(dict); return; } byte[] fileData = null; //read file data Task threadTask = new Task(() => { using (FileStream fileStream = new FileStream(fullFilePath, FileMode.Open)) { int dataLen = (int)fileStream.Length; if (dataLen > 0) { fileData = new byte[dataLen]; fileStream.Read(fileData, 0, dataLen); } } }); //add to io task queue lock ( _ioTaskList ) { IOTask newTask = new IOTask(); newTask.threadTask = threadTask; newTask.callback = (status) => { if (status == IOTask.RESULT_SUCCESS) { if (fileData == null) { Dictionary <string, object> dict = new Dictionary <string, object>(); dict.Add("data", "file data is empty!"); dict.Add("status", IO_RESULT_FAIL); callback(dict); } else { UnityWebRequest request = UnityWebRequest.Put(url, fileData); if (timeout > 0) { request.timeout = timeout; } AddRequestTask(request, url, "", needUnZip, callback); } } else { StringBuilder sb = new StringBuilder(); foreach (var ex in threadTask.Exception.InnerExceptions) { sb.Append(ex.Message); sb.Append("\n"); } string data = string.Format("{{\"code\":0,\"message\":\"read error:{0}\"}}", sb.ToString()); Dictionary <string, object> dict = new Dictionary <string, object>(); dict.Add("data", data); dict.Add("status", IO_RESULT_FAIL); callback(dict); } }; _ioTaskList.Add(newTask); } }
private Task OnRequestComplete(UnityWebRequest request, float startTime, bool needUnZip, string saveFileFullPath, HttpCallback callback, string matchMd5 = null) { Dictionary <string, object> dict = new Dictionary <string, object>(); int respCode = (int)request.responseCode; dict.Add("status", respCode); bool succeed = !request.isHttpError && !request.isNetworkError; if (succeed) { float endTime = Time.realtimeSinceStartup; ulong size = request.downloadedBytes; float speed = size / (endTime - startTime); dict.Add("size", size); dict.Add("speed", speed); string data = ""; if (needUnZip) { int ret = TryGetHttpData(request.downloadHandler.data, out data, true); if (ret != IO_RESULT_SUCCESS) { data = "{\"code\":0,\"data\":\"data unzip fail\"}"; } } else { // no need to save. if (string.IsNullOrEmpty(saveFileFullPath)) { data = request.downloadHandler.text; } else { byte[] downloadBytes = request.downloadHandler.data; //compare md5 if (matchMd5 != null && StringUtils.BytesToMD5(downloadBytes) != matchMd5) { data = string.Format("{{\"code\":5,\"message\":\"{0}\"}}", "md5 not match"); } else { Task threadTask = new Task((bytes) => { SaveFile(saveFileFullPath, (byte[])bytes); }, downloadBytes); lock ( _ioTaskList ) { IOTask newTask = new IOTask(); newTask.threadTask = threadTask; newTask.callback = (status) => { if (status == IOTask.RESULT_SUCCESS) { data = "ok"; dict.Add("data", data); } else { StringBuilder sb = new StringBuilder(); foreach (var ex in threadTask.Exception.InnerExceptions) { string s = ex.Message.Replace("\\", "\\\\"); sb.Append(s.Replace("\"", "\\\"")); sb.Append("\n"); } data = string.Format("{{\"code\":0,\"message\":\"{0}\"}}", sb.ToString()); Debug.LogError(data); dict.Add("data", data); } callback(dict); }; _ioTaskList.Add(newTask); } DisposeWebRequesat(request); return(threadTask); } } } dict.Add("data", data); } else { if (request.error != null) { dict.Add("data", request.error); } else { dict.Add("data", "request error, respCode:" + respCode.ToString()); } } callback(dict); DisposeWebRequesat(request); return(null); }
void Update() { if (_ioTaskList.Count > 0) { int runningCount = 0; Task canRunTask = null; //倒序删除 for (int i = _ioTaskList.Count - 1; i >= 0; i--) { IOTask ioTask = _ioTaskList[i]; if (ioTask.threadTask.IsCompleted) { _ioTaskList[i] = _ioTaskList[_ioTaskList.Count - 1]; _ioTaskList.RemoveAt(_ioTaskList.Count - 1); if (ioTask.threadTask.Status == TaskStatus.RanToCompletion) { ioTask.callback(IOTask.RESULT_SUCCESS); } else { ioTask.callback(IOTask.RESULT_FAIL); } continue; } if (ioTask.threadTask.Status == TaskStatus.Created) { if (canRunTask == null) { canRunTask = ioTask.threadTask; } else { runningCount++; } } } if (canRunTask != null && runningCount < MaxIOTask) { canRunTask.Start(); } } //请求管理 if (_httpRequestList.Count > 0) { RequestTask canRunRequest = null; int runningCount = 0; for (int i = _httpRequestList.Count - 1; i >= 0; i--) { var requestTask = _httpRequestList[i]; if (requestTask.status == RequestTask.EStatus.Completed || requestTask.status == RequestTask.EStatus.Canceled) { _httpRequestList[i] = _httpRequestList[_httpRequestList.Count - 1]; _httpRequestList.RemoveAt(_httpRequestList.Count - 1); continue; } if (requestTask.status == RequestTask.EStatus.Running) { if (requestTask.ioTask != null && requestTask.ioTask.IsCompleted) { requestTask.status = RequestTask.EStatus.Completed; } else { runningCount++; } } else { if (canRunRequest == null) { canRunRequest = requestTask; } } } if (canRunRequest != null && runningCount < MaxRequestTask) { canRunRequest.run(canRunRequest); } } }