/// <summary> /// /// </summary> /// <param name="objp">手动切换的IP对象,自动切换请置空</param> /// <param name="callback"></param> /// <param name="flag">手否是手动切换</param> public void AutoSwitchCDN(Object_IP objp, Action <string> callback, bool flag = false) { if (_index == -1) { _index = 0; } if (flag) { objp.HttpSetSpeed(); //if (objp.Speed != null) //{ hostAction.AddDnsResolve(objp.Ip, _domain); callback(string.Format("自动切换完成 [{0}]", objp.Ip)); //} } else { if (CDN_List.Count <= 0) { callback("没有可以切换的服务器..."); return; } for (int i = _index; i < CDN_List.Count; i++) { var obj = new Object_IP(); obj.Ip = CDN_List[i].Ip; //obj.HttpSetSpeed(); _index++; //if (obj.Speed != null) //{ hostAction.AddDnsResolve(obj.Ip, _domain); callback(string.Format("自动切换完成 [{0}] ", obj.Ip)); break; //} } if (_index >= CDN_List.Count / 2) { _index = 0; } } }
/// <summary> /// 获取可用的缓存服务器列表 /// </summary> private void SwitchMethod(object token) { CancellationToken ct = (CancellationToken)token; if (ct.IsCancellationRequested) { return; } GetIPInfoList getlist = new GetIPInfoList(); dnsList.Clear(); if (dnsList.Count <= 0) { DeterMineCall(() => { AddSwitchListViewItem("正在从服务器更新列表...", Color.Navy, ""); }); List <Object_Server> list = getlist.GetSourceItem(dnsInterface); if (list == null) { AddSwitchListViewItem("警告: 下载服务器列表失败, 10秒钟后重试.", Color.Red, ""); Thread.Sleep(10000); SwitchMethod(ctsSwitch.Token); } else { Parallel.ForEach(list, x => AddServerListViewItem(Color.Blue, x)); AddSwitchListViewItem("下载服务器列表成功,已经获得 {0} 个服务器IP.", Color.Navy, list.Count); AddSwitchListViewItem("开始测试服务器速度...", Color.Navy, ""); } bool flag = false; foreach (Object_Server s in list) { if (s.Ip == address) { flag = true; break; } } if (!flag) { var oServer = new Object_Server() { Ip = address, LocalSpeed = 0, FailedCount = 0, BrokenCount = 0, AddTime = DateTime.Now, ValidCount = 0 }; list.Add(oServer); } CallbackServer(list, dic => { if (ct.IsCancellationRequested) { DeterMineCall(() => { foreach (ListViewItem lvi in lvServerList.Items) { if (lvi.Group.Name == "test") { lvi.Group = lvServerList.Groups["testing"]; } } }); return; } lock (locker) { DeterMineCall(() => { var obj = new Object_IP(); obj = (Object_IP)dic[1]; var server = new Object_Server(); server = (Object_Server)dic[0]; var lvi = new ListViewItem(); lvi.SubItems.Add("时间"); lvi.SubItems.Add("信息"); lvi.SubItems[0].Text = DateTime.Now.ToLongTimeString(); if (!obj.IsForbidden) { if (!obj.IsNotValid) { server.LocalSpeed = Convert.ToInt16(obj.Speed.Value.TotalMilliseconds); if (obj.Speed.Value.TotalSeconds > 1) { dnsList.Remove(obj); lvi.ForeColor = Color.FromArgb(192, 64, 0); RefreshServerList(0, server); lvi.SubItems[1].Text = string.Format("服务器 [{0}] 响应速度过低, 放弃使用. (响应速度={1}秒)", obj.Ip, obj.Speed.Value.TotalSeconds.ToString("#0.00")); } else { dnsList.Add(obj); lvi.ForeColor = Color.Green; RefreshServerList(1, server); lvi.SubItems[1].Text = string.Format("服务器 [{0}] 正常. (响应速度={1}秒)", obj.Ip, obj.Speed.Value.TotalSeconds.ToString("#0.00")); } } else { dnsList.Remove(obj); lvi.ForeColor = Color.Red; server.LocalSpeed = -1; RefreshServerList(2, server); lvi.SubItems[1].Text = string.Format("服务器 [{0}] 当前不可用. ({1})", obj.Ip, obj.Message); } } else { dnsList.Remove(obj); lvi.ForeColor = Color.Red; server.LocalSpeed = -2; RefreshServerList(3, server); lvi.SubItems[1].Text = string.Format("服务器 [{0}] 已禁止了您的IP. ({1})", obj.Ip, obj.Message); } uploadList.Add(server); lvSwitch.Items.Insert(0, lvi); }); } }); //}); //rbtnFishlee.Checked? Properties.Resources.GetDnsInterface:Properties.Resources.GetDnsInterfaceATM //排序 if (ct.IsCancellationRequested) { return; } dnsListTmp = dnsList; getlist.SortList((lists) => { AddSwitchListViewItem("服务器测试完毕...共得到可用服务器{0}个", Color.Navy, new object[] { dnsListTmp.Count }); //上报到云端 try { AddSwitchListViewItem("开始上报到云端...", Color.Navy, ""); var wc = new WebClient(); wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); wc.UploadString(uploadCloud, "POST", string.Format("kyfw.12306.cn={0}", HttpUtility.UrlEncode(JsonConvert.SerializeObject(this.uploadList)))); AddSwitchListViewItem("上报成功...", Color.Navy, ""); dnsListTmp = lists; } catch { AddSwitchListViewItem("上报失败...", Color.Navy, ""); } }, dnsListTmp, GetIPInfoList.SortOrder.Ascending); switchSeed = 0; CDNSwitcher.CDN_List.Clear(); CDNSwitcher.CDN_List.AddRange(dnsListTmp); //开启监控线程 if (!listenFlag) { try { hostAction.AddDnsResolve(dnsListTmp[0].Ip, domain); switchSeed++; } catch { } ListenLocalHost(); } Thread.Sleep(60 * 60 * 1000); lvServerList.Clear(); StartGetDnsList(); } }