电竞比分网-中国电竞赛事及体育赛事平台

分享

解決INDY組件IDHTTP超時問題

 aaie_ 2012-10-10
正 文:

    飄易在以前的博文里曾經(jīng)提起過INDY組件IDHTTP超時問題,鏈接:《INDY組件IDFTP/IDHTTP的connecttimeout超時問題》,在那篇文字里,我采用了ICS的組件代替INDY組件的方法解決這個超時問題。今天,我看到那篇文章下面的一位網(wǎng)友留言: “嘿嘿,哪兒有那么麻煩了,不需要修改代碼。indy這么多年了,這種低級錯誤在indy10里面處理的差不多了。
只要設(shè)置
   IdFTP1.ReadTimeout:=3000;
   IdFTP1.ConnectTimeout:=3000;
這就OK了。
IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,不要去掉,加上 IdFTP1.ReadTimeout:=3000;
就成了?!?     經(jīng)過飄易的測試,果然,當(dāng)加上 ReadTimeout 的屬性時,我要的延時時間的效果就出來了。雖然超時的時間和我預(yù)期的有所差別,但這個INDY 10 版本的超時時間真的起了作用。詳細(xì)的分析看我的測試,我的測試代碼如下:
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;
    我對這樣的網(wǎng)址 www.qq.org、www.youtube.com 進(jìn)行了測試,當(dāng)我沒有加上 IdHTTP1.ReadTimeout 這個屬性時,訪問以上2個網(wǎng)址的超時時間均是 20秒左右,無論 IdHTTP1.ConnectTimeout 設(shè)置多少。而當(dāng)我加上 IdHTTP1.ReadTimeout 屬性時,超時時間立即體現(xiàn)了出來。

ReadTimeout設(shè)為1000ms時,實(shí)際超時時間為3125ms
ReadTimeout設(shè)為2000ms時,實(shí)際超時時間為6125ms
ReadTimeout設(shè)為3000ms時,實(shí)際超時時間為9125ms
ReadTimeout設(shè)為4000ms時,實(shí)際超時時間為12125ms
ReadTimeout設(shè)為5000ms時,實(shí)際超時時間為15125ms
ReadTimeout設(shè)為6000ms時,實(shí)際超時時間為18125ms
ReadTimeout設(shè)為7000ms時,實(shí)際超時時間為20969ms
ReadTimeout設(shè)為8000ms時,實(shí)際超時時間為20953ms
ReadTimeout設(shè)為9000ms時,實(shí)際超時時間為20953ms
    從以上的實(shí)際測驗(yàn)數(shù)據(jù)來看,飄易發(fā)現(xiàn),當(dāng) ReadTimeout 設(shè)置值小于7秒時,實(shí)際超時時間是 ReadTimeout的值的3倍(即=ReadTimeout*3);當(dāng) ReadTimeout 設(shè)置值大于7s時,實(shí)際超時時間維持在20s左右,這是因?yàn)閕ndy10組件的默認(rèn)最大超時時間即20S。實(shí)際超時時間和 ConnectTimeout 并無關(guān)系。     飄易猜測,ConnectTimeout只有在網(wǎng)絡(luò)正常的情況下才有效,而當(dāng)網(wǎng)絡(luò)不正常時,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,這2個屬性應(yīng)該結(jié)合實(shí)用,感謝“悅?cè)淮笪颉薄?

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多