using CCWin; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SufeiUtil; using SXLibrary; using System; using System.Collections.Generic; using System.Data.Common; using System.Data.SQLite; using System.IO; using System.Net; using System.Threading; using System.Windows.Forms; namespace MOKA_Factory_Tools { public partial class Upgrade : Skin_Color { public string RequireHost;//请求的服务器地址 public string DownloadLink;//key包的下载地址 public string DownloadSize;//key包的大小 public string Ordername;//订单号 public string Ordernumber;//订单数量 public string Orderclient;//客户机型 public string OrderPID;//PID public string OrderSV;//软件版本 public string packet_md5;//key包的MD5校验 public bool[] threadendTag;//判断各线程是否接收完文件 public string[] filenameList;//各线程下载的小文件名列表 public int[] filestartpos;//各线程开始读取文件的位置 public int[] filesize;//小文件大小 public string url;//请求链接 public bool union;//判断文件是否合并完成 public int thread;//线程数 public bool EEPROMNow;//合成EEPROMkey public SQLiteConnection errorDBNow; public int wholesize; public string factorynumNow; public Upgrade(System.Data.SQLite.SQLiteConnection errorDB, string DownloadLinkInput, string factorynum) { InitializeComponent(); skinLabel1.Text = LResource.DownloadUpgradePackage; this.Text = LResource.Download; Control.CheckForIllegalCrossThreadCalls = false; DownloadLink = DownloadLinkInput;// errorDBNow = errorDB; factorynumNow = factorynum; } private void skinButton1_Click(object sender, EventArgs e) { this.Dispose(); this.Close(); } public void StartDownload() { url = DownloadLink; HttpWebRequest request; long filesizew = 0; try { request = (HttpWebRequest)HttpWebRequest.Create(url);//建立一个HTTP请求 HttpWebResponse response = request.GetResponse() as HttpWebResponse; filesizew = response.ContentLength;//得到文件总大小 response.Close(); request.Abort();//取消请求 } catch (Exception ex) { MessageBox.Show(LResource.Error + ": " + ex.Message, LResource.Error); Log.WriteErrorLog("\r\nCreate Http require error:"+ ex.Message); CommonMethod.ReportErrormsg("Fail to init download process", ex.Message + "\r\ndownload link:" + url, errorDBNow); return; } thread = Convert.ToInt32("1", 10); threadendTag = new bool[thread]; filenameList = new string[thread]; filestartpos = new int[thread]; filesize = new int[thread]; int filethread = (int)filesizew / thread; int filethreade = filethread + (int)filesizew % thread; string filePath = AppDomain.CurrentDomain.BaseDirectory + "\\"; //文件大小切割 for (int i = 0; i < thread; i++) { threadendTag[i] = false; filenameList[i] = filePath + Path.GetFileName(DownloadLink); ;//+ "-" + i.ToString() if (i < thread - 1) { filestartpos[i] = filethread * i; filesize[i] = filethread - 1; } else { filestartpos[i] = filethread * i; filesize[i] = filethreade - 1; } } Thread[] threadk = new Thread[thread]; HttpFile2[] httpfile = new HttpFile2[thread]; //各进程开始下载 for (int j = 0; j < thread; j++) { httpfile[j] = new HttpFile2(this, j); threadk[j] = new Thread(new ThreadStart(httpfile[j].ReceiveFile)); threadk[j].Start(); } } private void Download_Shown(object sender, EventArgs e) { StartDownload(); } private void Download_FormClosed(object sender, FormClosedEventArgs e) { this.Dispose(); this.Close(); } public void SetspecificText(Label label, string str) { if (label.InvokeRequired) { BeginInvoke(new Action(x => { label.Text = x.ToString(); }), str); } else { label.Text = str; } } } public class HttpFile2 { public Upgrade formm;//声明一个窗体类 public int threadIndex;//进程标识 public string filenamea;//下载的小文件名 public string strUrl;//请求的链接 public FileStream fs; public HttpWebRequest request; public HttpWebResponse response; public Stream ns; public byte[] nbytes;//接收缓冲区 public int nreadsize;//接收字节数 public HttpFile2(Upgrade form, int thread) { formm = form; threadIndex = thread; } ~HttpFile2() { formm.Dispose(); } public int GetThread { get { return threadIndex; } } public int GetFilesize { get { return formm.filesize[threadIndex]; } } public void ReceiveFile()//线程开始接收文件 { filenamea = formm.filenameList[threadIndex]; strUrl = formm.DownloadLink; ns = null; nbytes = new byte[1024]; nreadsize = 0; //formm.recevMsg.Items.Add("线程" + threadIndex.ToString() + "开始接收:" + "文件大小" + Math.Ceiling(formm.filesize[threadIndex] / 1024.0f) + "KB"); formm.ProgressBar1.Maximum = Convert.ToInt32(Math.Ceiling(formm.filesize[threadIndex] / 1024.0f)); fs = new FileStream(filenamea, FileMode.Create); try { request = (HttpWebRequest)WebRequest.Create(strUrl); request.KeepAlive = false; //request.ProtocolVersion = HttpVersion.Version10; request.Proxy = null;//WebRequest.DefaultWebProxy;//不使用代理,减少自动搜索代理的过程,提升性能 //要接收文件的字节范围 //request.AddRange(formm.filestartpos[threadIndex], formm.filestartpos[threadIndex] + formm.filesize[threadIndex]); request.Timeout = 5 * 60 * 1000; System.Net.ServicePointManager.DefaultConnectionLimit = 200; //ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; response = request.GetResponse() as HttpWebResponse; ns = response.GetResponseStream(); nreadsize = ns.Read(nbytes, 0, nbytes.Length); int preocess = 0; while (nreadsize > 0) { fs.Write(nbytes, 0, nreadsize); //formm.recevMsg.Items.Add("线程" + threadIndex.ToString() + "已下载字节:" + Math.Ceiling(nreadsize / 1024.0f) + "KB"); nreadsize = ns.Read(nbytes, 0, nbytes.Length); preocess += (int)Math.Ceiling(nreadsize / 1024.0f); if(preocess<= formm.ProgressBar1.Maximum) { formm.ProgressBar1.Value = preocess; } } fs.Close(); ns.Close(); response.Close(); GC.Collect(); CommonMethod.UpgradeReport(UpgradeReportUrl.Officialurl, formm.factorynumNow, "Success", formm.errorDBNow); MessageBox.Show(LResource.UpgradeDownloadSuccess); System.Diagnostics.Process.Start(formm.filenameList[0]); Thread.Sleep(500); Environment.Exit(0); } catch (Exception ex) { MessageBox.Show(ex.Message, LResource.Error) ; Log.WriteErrorLog("\r\nDownload error:" + ex.Message); CommonMethod.ReportErrormsg("Fail to download upgrade package", ex.Message+"\r\ndownload link:"+ formm.DownloadLink, formm.errorDBNow); fs.Close(); response.Close(); formm.Close(); GC.Collect(); return; } formm.Close(); } private static string JSON_SeleteNode(JToken json, string ReName) { try { string result = ""; //这里6.0版块可以用正则匹配 var node = json.SelectToken("$.." + ReName); if (node != null) { //判断节点类型 if (node.Type == JTokenType.String || node.Type == JTokenType.Integer || node.Type == JTokenType.Float) { //返回string值 result = node.Value().ToString(); } } return result; } catch (Exception ex) { return ""; } } } }