异步http请求的实现
这是我自己在某论坛上发的一篇水贴:http://www.sufeinet.com/thread-9275-1-2.html,原理和解释,我就直接重发一遍在自己博客上了。
时隔一个月 回来把之前的坑填上。之前发的两篇文章链接如下: 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栈大小总是有限的 过多的数据注入 会导致丢包 网络拥塞 ,请慎重计算你要注入网络的数据包量。一句话 不要无限制的发起请求 因为多的请求最终会超时 而你很可能是造成网络拥塞的元凶。
欢迎测试或拍砖。
源代码改日上传(。。我忘了论坛密码,或者直接上论坛上下载也可。)论坛上下载次数已经接近两百次。
觉得用得上,您就点个赞。
异步http请求的实现的更多相关文章
- iOS 多个异步网络请求全部返回后再执行具体逻辑的方法
对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...
- Android中的异步网络请求
本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...
- jmeter 异步子请求测试随笔
好久没写技术类的博客了,都不知道自己都在忙啥.... 最近陆续遇到了一些异步子请求的测试需求,比如打开某一个页面A,A页面里的js会再调用B,C,D,E等请求,针对这个页面的测试,我最近做了一些思考: ...
- Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...
- jquery.ajax异步发送请求的简单测试
使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...
- JavaScript异步并发请求问题
JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题
- Android Asynchronous Http Client-Android异步网络请求客户端接口
1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...
- AJAX其实就是一个异步网络请求
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).其实就是一个异步网络请求. 一.创建对象 var xmlhttp; if (w ...
- IOS9中使用NSURLConection发送异步网络请求
IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...
- 基于netty的异步http请求
package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...
随机推荐
- occal [问题解决]ORA-01427: 单行子查询返回多个行
有人问题我一个问题,情况如下:他要用根据divide_act_channel_day的new_amount字段去更新divide_stat的new_amount字段.两张表关联的条件:day=log_ ...
- leetcode 39 组合总和 JAVA
题目: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制 ...
- [Swift实际操作]八、实用进阶-(5)通过间接代理进行对象间的消息传递
本文将为你演示,如何通过简介代理的方式,进行对象间的消息传递在左侧的项目导航区,打开自定义视图的代码文件(CustomView.swift). import UIKit class CustomVie ...
- ArchLinux "error: required key missing from keyring"
downloading required keys... error: key "C847B6AEB0544167" could not be looked up remotely ...
- codis__使用注意事项
codis 不支持批量的命令, codis对 redis-server 的最低版本要求是 2.8.13
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- ARC初步介绍
[转载自 http://onevcat.com/2012/06/arc-hand-by-hand/] 手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objecti ...
- jQuery 与 js的入口函数写法
//js的入口函数执行要比jQuery的入口函数执行得晚一些. //jq的入口函数会等待页面的加载完成才执行,但是不会等待图片的加载. //js的入口函数会等待页面加载完成,并且等待图片加载完成才开始 ...
- [Alpha]团队成员贡献分配规则
设计参考 参考了往届团队sigma_rg.NewTeam.hotcode5.软剑攻城的四个评分规则后,希望该规则能队内减轻竞争的紧张气氛的同时,有具体的评分规则. 分配总则 基础分值固定为30分,将剩 ...
- JAVA编译结果中有****$1.class的
java编译后的文件名字带有$接数字的就是匿名内部类的编译结果,接名字的就是内部类的编译结果 例如:TestFrame$1.class是匿名内部类的编译结果,TestFrame$MyJob.class ...