C#实现IP代理池调度的示例代码

 更新时间:2023年07月18日 11:11:22   作者:Csharp 小记  
这篇文章主要为大家介绍了C#实现IP代理池调度的相关知识,文中的示例代码讲解详细,具有一定的参考与学习价值,感兴趣的小伙伴可以了解一下

前言

稍微介绍下这个代码的用途,在做某些功能的时候,我们可能会用到IP代理,购买IP的时候也是可以选择长期高质量IP或者短失效但量大的IP,这个主要根据用途来购买;这里就是基于大量短失效IP做的一个IP调度,尽可能保证IP能够物尽其用。

实现

1.首先定义一个IPPool类,然后在构造函数中传入以下参数

public class IPPool
 {
     readonly string _ipUrl, _checkUrl;
     readonly int _saveCount;
     readonly bool _loopUse;
     public ConcurrentQueue<string> IPQueue = new ConcurrentQueue<string>();
     /// <summary>
     /// 代理IP池
     /// </summary>
     /// <param name="ipUrl">代理IP的获取网址</param>
     /// <param name="checkUrl">检查IP可用性的网址</param>
     /// <param name="saveCount">IP池的存储量</param>
     /// <param name="loopUse">是否循环使用</param>
     public IPPool(string ipUrl, string checkUrl, int saveCount, bool loopUse=true)
        {
            _ipUrl = ipUrl;
            _checkUrl = checkUrl;
            _saveCount = saveCount;
            _loopUse = loopUse;
        }

2.解析网页上的IP地址,这里使用虚方法,以方便可以重写解析方法,应对不同的数据类型

 /// <summary>
        /// 解析网址IP
        /// </summary>
        /// <returns></returns>
        protected virtual List<string> Parse()
        {
            List<string> list = new List<string>();
            try
            {
                HttpClient httpClient = new HttpClient();
                httpClient.Timeout = new TimeSpan(0, 0, 10);
                var result = httpClient.GetStringAsync(_ipUrl).Result;
                JObject jobj = JObject.Parse(result);
                if (jobj["code"].ToString() == "1")
                {
                    JArray jarr = (JArray)jobj["data"];
                    foreach (var item in jarr)
                    {
                        string ip = item["ip"].ToString() + ":" + item["port"].ToString();
                        list.Add(ip);
                    }
                }
            }
            catch { }
            return list;
        }

3.检查IP可用性,这里可以使用你需要访问的网址或者百度进行Get,保证可以访问到即可,同样使用虚方法定义

/// <summary>
        /// 检查IP可用性
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        protected virtual bool Check(string ip)
        {
            HttpClient httpClient = new HttpClient();
            httpClient.Timeout = new TimeSpan(0, 0, 10);
            bool result = httpClient.GetAsync(_checkUrl).Result.StatusCode == HttpStatusCode.OK;
            return result;
        }

4.开始获取,使用定时器获取,同样因为有设置队列的最大值,所以只有当低于这个阈值时才会进行补充,防止IP浪费的同时保证IP充足够用

/// <summary>
        /// 开始获取
        /// </summary>
        /// <param name="interval">获取间隔</param>
        public virtual void Start(double interval)
        {
            System.Timers.Timer timer = new System.Timers.Timer(interval);
            timer.Elapsed += (s, e) =>
            {
                if (IPQueue.Count < _saveCount)
                {
                    List<string> list = Parse();
                    foreach (var ip in list)
                    {
                        IPQueue.Enqueue(ip);
                    }
                }
            };
            timer.Start();
        }

5.获取IP,从队列中获取,如果设置了循环使用的话,不失效可以一直使用,进一步保证IP资源

/// <summary>
        /// 获取IP
        /// </summary>
        /// <returns></returns>
        public virtual string Get()
        {
            string ip = null;
            while (IPQueue.Count > 0)
            {
                IPQueue.TryPeek(out ip);
                if (!string.IsNullOrEmpty(ip)&&Check(ip))
                {
                    if (!_loopUse)
                    {
                        IPQueue.TryDequeue(out ip);
                    }
                    break;
                }
                else
                {
                    IPQueue.TryDequeue(out string result);
                }
            }
​​​​​​​            return ip;
        }
    }

6.为方便测试,我们自定义一个类继承IPPool,然后重写Parse以及Check方法

public IPHelper(string ipUrl, string checkUrl, int saveCount, bool loopUse = true) : base(ipUrl, checkUrl, saveCount,loopUse)
        {
​​​​​​​        }
        protected override List<string> Parse()
        {
            List<string> list = new List<string>();
            list.Add(DateTime.Now.Ticks.ToString());
            return list;
        }
        protected override bool Check(string ip)
        {
            return true;
        }

7.最后调用下看看效果

private async void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            IPHelper iPHelper = new IPHelper("", "", 10,false);
            iPHelper.Start(200);
            for (int i = 0; i < 5; i++)
            {
                string ip = iPHelper.Get();
                if (ip != null)
                {
                    listBox1.Items.Add(ip);
                }
                await Task.Delay(500);
            }
        }
​​​​​​​        private async void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            IPHelper iPHelper = new IPHelper("", "", 10);
            iPHelper.Start(200);
            for (int i = 0; i < 5; i++)
            {
                string ip = iPHelper.Get();
                if (ip != null)
                {
                    listBox1.Items.Add(ip);
                }
                await Task.Delay(500);
            }
        }

实现效果

到此这篇关于C#实现IP代理池调度的示例代码的文章就介绍到这了,更多相关C# IP代理池调度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# Bitmap图像处理(含增强对比度的三种方法)

    C# Bitmap图像处理(含增强对比度的三种方法)

    本文主要介绍了C# Bitmap图像处理(含增强对比度的三种方法),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C#身份证号码验证是否正确

    C#身份证号码验证是否正确

    这一篇关于C#语言验证18位身份证号码的验证方法和实例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • C#操作DataTable方法实现过滤、取前N条数据及获取指定列数据列表的方法

    C#操作DataTable方法实现过滤、取前N条数据及获取指定列数据列表的方法

    这篇文章主要介绍了C#操作DataTable方法实现过滤、取前N条数据及获取指定列数据列表的方法,实例分析了C#操作DataTable的各种常用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 使用WPF实现一个虚拟键盘的代码示例

    使用WPF实现一个虚拟键盘的代码示例

    在某些特定场景下,我们可能需要使用虚拟键盘来替代实体键盘,本文将详细介绍如何使用 WPF 来实现一个虚拟键盘,并监控键盘输入,从而达到完全替代实体键盘的目的,需要的朋友可以参考下
    2025-04-04
  • asp.net(c#)编程实现将彩色图片变灰阶图片的方法示例

    asp.net(c#)编程实现将彩色图片变灰阶图片的方法示例

    这篇文章主要介绍了asp.net(c#)编程实现将彩色图片变灰阶图片的方法,结合实例形式分析了C#图片读取及属性操作相关技巧,需要的朋友可以参考下
    2017-07-07
  • C#读取文件MD5值的实现代码

    C#读取文件MD5值的实现代码

    这篇文章主要介绍了C#读取文件MD5值的实现代码,有了这个核心代码,就可以实现校验文件MD5值的一些程序了,需要的朋友可以参考下
    2014-08-08
  • C#实现将千分位字符串转换成数字的方法

    C#实现将千分位字符串转换成数字的方法

    这篇文章主要介绍了C#实现将千分位字符串转换成数字的方法,很适合初学者更好的理解C#字符串原理,需要的朋友可以参考下
    2014-08-08
  • C#操作SQLite数据库帮助类详解

    C#操作SQLite数据库帮助类详解

    这篇文章主要介绍了C#操作SQLite数据库帮助类,详细分析了C#针对sqlite数据库的连接、查询、分页等各种常见操作的实现与封装技巧,需要的朋友可以参考下
    2017-07-07
  • 如何通过IL了解C#类的构造函数浅析

    如何通过IL了解C#类的构造函数浅析

    这篇文章主要给大家介绍了关于如何通过IL了解C#类的构造函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • WPF使用DrawingContext实现绘制刻度条

    WPF使用DrawingContext实现绘制刻度条

    这篇文章主要为大家详细介绍了如何利用WPF DrawingContext实现绘制刻度条,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2022-09-09

最新评论