http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 31270|回复: 40

[综合] HttpHelper异步版完整实现(附源代码)

[复制链接]
发表于 2014-6-30 10:55:16 | 显示全部楼层 |阅读模式
              时隔一个月  回来把之前的坑填上。
              之前发的l两篇文章链接如下:
              http://www.sufeinet.com/thread-8876-1-1.html
             http://www.sufeinet.com/thread-8882-1-1.html
            跟之前的区别在于 这一次是完整 真正可用的代码 可以完全用于商业目的  因为我已经不间断的跑了一个月 没有任何问题。
            异步实现的最大坑在于   你发出一个异步请求之后 你可能收不到任何响应 ,你发出的包,可能在Internet上看风景去了,漫游去了,或者被各种延迟,各种阻塞,或者被路由器负载脱落,各种丢失,TCP建立起的连接对应于网络层的VC(虚电路)可能以各种形式断开然后你永远不会知道。。
所以 由于网络层的各种不稳定 所以在传输层你必须建立起稳妥的解决方案 将控制权把握在自己手上。
解决方案很简单。计数器而已。  计数器让线程池帮我们做就好了:
   System.Threading.ThreadPool.RegisterWaitForSingleObject(m_ar.AsyncWaitHandle,
                    TimeoutCallback, pa, MyAsyncPara.DefaultTimeOutSpan, true);



这段代码使用一个信号量,用CLR的用户模式构造  System.Threading.Interlocked.Increment(ref pa.m_semaphore) != 1   超时便不再处理数据


OK了,现在来看看调用:


HttpItems hi = new HttpItems();
AsyncHttpHelper wh = new AsyncHttpHelper();
hi.URL = urlinfo.Url;
wh.GetHtmlDataAsync(hi, YourCallBackMethod);


void YourCallBackMethod(HttpResults result)
{


}


好了 代码跑起来的效果就是,一个线程处理处理一堆爬取任务速度飞快有木有!绝对不卡当前线程有木有!


最后提2点注意事项:
1  以太网协议的最大允许字节为1500多  无线局域网的最大允许字节为2200多 IP协议最大允许字节为65500多  为了让爬虫适合在任意网络上执行 缓存区设置为1KB比较合适  


2 同学们 请对你们自己注入IP网络的数据包负责 因为不管是电脑还是路由器 他们的TCP栈大小总是有限的 过多的数据注入 会导致丢包 网络拥塞  ,请慎重计算你要注入网络的数据包量。一句话 不要无限制的发起请求 因为多的请求最终会超时 而你很可能是造成网络拥塞的元凶。


欢迎测试或拍砖。






AsyncHttpHelper.zip

5.58 KB, 下载次数: 687, 下载积分: 金钱 -1

Http异步版源码



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-7-29 21:18:41 | 显示全部楼层
标准异步:
using System;
using System.Threading;
namespace 异步
{
    delegate void AsyncFoo(int i);
    class Program
    {
        /// ﹤summary﹥   
        /// 输出当前线程的信息   
        /// ﹤/summary﹥      
        /// ﹤param name="name"﹥方法名称﹤/param﹥   
        static void PrintCurrThreadInfo(string name)
        {
            Console.WriteLine("Thread Id of " + name + " is: " + Thread.CurrentThread.ManagedThreadId + ", current thread is "
                + (Thread.CurrentThread.IsThreadPoolThread ? "" : "not ") + "thread pool thread.");
        }


        /// ﹤summary﹥   
        /// 测试方法,Sleep一定时间   
        /// ﹤/summary﹥   
        /// ﹤param name="i"﹥Sleep的时间﹤/param﹥   
        static void Foo(int i)
        {
            PrintCurrThreadInfo("Foo()");
            Thread.Sleep(i);
        }


        /// ﹤summary﹥   
        /// 投递一个异步调用   
        /// ﹤/summary﹥   
        static void PostAsync()
        {
            AsyncFoo caller = new AsyncFoo(Foo);
            caller.BeginInvoke(1000, new AsyncCallback(FooCallBack), caller);
        }


        static void Main(string[] args)
        {
            PrintCurrThreadInfo("Main()");
            for (int i = 0; i < 5; i++)
            {
                PostAsync();
            }
            Console.ReadLine();
        }


        static void FooCallBack(IAsyncResult ar)
        {
            PrintCurrThreadInfo("FooCallBack()");
            AsyncFoo caller = (AsyncFoo)ar.AsyncState;
            caller.EndInvoke(ar);
        }
    }
}
发表于 2014-6-30 10:59:35 | 显示全部楼层
表示感谢,楼主无私奉献!!
发表于 2014-6-30 11:29:38 | 显示全部楼层
加油,我们都看好你哦。
 楼主| 发表于 2014-6-30 12:50:49 | 显示全部楼层
回馈而已。。 @站长苏飞 不必客气   有空多交流
发表于 2014-6-30 13:19:13 | 显示全部楼层
好好写,有时间了我也看看,写好了可以 跟我的Httphelper一样开个分类给你
发表于 2014-6-30 15:01:25 | 显示全部楼层
感谢分享.:
回复

使用道具 举报

发表于 2014-6-30 16:20:32 | 显示全部楼层
支持个
回复

使用道具 举报

发表于 2014-6-30 17:01:09 | 显示全部楼层
我觉得用苏飞的HttpHelper就可以了,至于线程可以在程序里实现。你可以在抓取的时候开个线程就行了。
发表于 2014-7-1 07:57:56 | 显示全部楼层
mark~~看上去很流弊的样子。。学习 学习~~哈哈
 楼主| 发表于 2014-7-3 17:40:56 | 显示全部楼层
异步和线程和两个概念 当然如果只是玩玩 随便怎样都可以。从我跑的效果来看,异步版的.net应该是内置了IOCP模型 。这点从.net framework源码也可以得到佐证
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-29 02:29

© 2014-2021

快速回复 返回顶部 返回列表