飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

解决INDY组件IDHTTP超时问题

Author:飘易 Source:飘易
Categories:Delphi编程 PostTime:2010-12-11 17:13:04
正 文:
    飘易在以前的博文里曾经提起过INDY组件IDHTTP超时问题,链接:《INDY组件IDFTP/IDHTTP的connecttimeout超时问题》,在那篇文字里,我采用了ICS的组件代替INDY组件的方法解决这个超时问题。今天,我看到那篇文章下面的一位网友留言:

“嘿嘿,哪儿有那么麻烦了,不需要修改代码。indy这么多年了,这种低级错误在indy10里面处理的差不多了。
只要设置
   IdFTP1.ReadTimeout:=3000;
   IdFTP1.ConnectTimeout:=3000;
这就OK了。
IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,不要去掉,加上 IdFTP1.ReadTimeout:=3000;
就成了。”

    经过飘易的测试,果然,当加上 ReadTimeout 的属性时,我要的延时时间的效果就出来了。虽然超时的时间和我预期的有所差别,但这个INDY 10 版本的超时时间真的起了作用。详细的分析看我的测试,我的测试代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
t1,t2:int64;
str1:string;
IdHTTP1:TIdHTTP;
begin
try
t1:=GetTickCount; //毫秒级
IdHTTP1 := TIdHTTP.create(nil);
IdHTTP1.ReadTimeout:= strtoint(edit2.Text)*1000;
IdHTTP1.ConnectTimeout:= strtoint(edit3.Text)*1000;
str1:=IdHTTP1.Get(edit1.Text);
IdHTTP1.Free;
t2:=GetTickCount;
memo1.Clear ;
memo1.Lines.add(inttostr(t2-t1));
memo1.Lines.add(str1);
except
t2:=GetTickCount;
memo1.Clear ;
memo1.Lines.add(inttostr(t2-t1));
memo1.Lines.add('err:'+DateTimeToStr(now()));
end;
end;

    我对这样的网址 www.qq.org、www.youtube.com 进行了测试,当我没有加上 IdHTTP1.ReadTimeout 这个属性时,访问以上2个网址的超时时间均是 20秒左右,无论 IdHTTP1.ConnectTimeout 设置多少。而当我加上 IdHTTP1.ReadTimeout 属性时,超时时间立即体现了出来。

ReadTimeout设为1000ms时,实际超时时间为3125ms
ReadTimeout设为2000ms时,实际超时时间为6125ms
ReadTimeout设为3000ms时,实际超时时间为9125ms
ReadTimeout设为4000ms时,实际超时时间为12125ms
ReadTimeout设为5000ms时,实际超时时间为15125ms
ReadTimeout设为6000ms时,实际超时时间为18125ms
ReadTimeout设为7000ms时,实际超时时间为20969ms
ReadTimeout设为8000ms时,实际超时时间为20953ms
ReadTimeout设为9000ms时,实际超时时间为20953ms

    从以上的实际测验数据来看,飘易发现,当 ReadTimeout 设置值小于7秒时,实际超时时间是 ReadTimeout的值的3倍(即=ReadTimeout*3);当 ReadTimeout 设置值大于7s时,实际超时时间维持在20s左右,这是因为indy10组件的默认最大超时时间即20S。实际超时时间和 ConnectTimeout 并无关系。

    飘易猜测,ConnectTimeout只有在网络正常的情况下才有效,而当网络不正常时,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,这2个属性应该结合实用,感谢“悦然大悟”。
作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:关于Delphi编程的文章小集
下一篇:在线网站监测软件(免费短信通知)—飘易发布
2条评论 “解决INDY组件IDHTTP超时问题”
2010-12-13 9:33:36
再次飘过。。。学习了,,有问题好解决。。
2011-8-13 11:05:49
read与connect不一样。read设置为3可能并不会是3
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号