Delphi IdFTP[3] TIdFTP.Connect、IdFTP.ReadTimeout - 連接和超時的解讀
1、TIdFTP.Connect - 打開與FTP服務器的連接。
原型:
procedure Connect(AAutoLogin: boolean = True; const ATimeout: Integer = IdTimeoutDefault); reintroduce;
procedure TIdFTP.Connect(AAutoLogin: boolean = True; const ATimeout: Integer = IdTimeoutDefault);
var
TmpHost: String;
TmpPort: Integer;
begin
try
//APR 011216: proxy support
TmpHost:=FHost;
TmpPort:=FPort;
try
if (ProxySettings.ProxyType > fpcmNone) and (Length(ProxySettings.Host) > 0) then begin
FHost := ProxySettings.Host;
FPort := ProxySettings.Port;
end;
inherited Connect(ATimeout);
finally
FHost := TmpHost;
FPort := TmpPort;
end;//tryf
GetResponse([220]);
Greeting.Assign(LastCmdResult);
if AAutoLogin then begin
Login;
DoAfterLogin;
SendTransferType;
// OpenVMS 7.1 replies with 200 instead of 215 - What does the RFC say about this?
if SendCmd('SYST', [200, 215, 500]) = 500 then begin {Do not translate}
FSystemDesc := RSFTPUnknownHost;
end else begin
FSystemDesc := LastCmdResult.Text[0];
end;
DoStatus(ftpReady, [RSFTPStatusReady]);
end;
except
Disconnect;
raise;
end;
end;
參數:
- AAutoLogin: boolean = True //連接時登錄用戶。默認值為True。
- Timeout: Integer = IdTimeoutDefault //IdTimeoutDefault是一個常量整數值(默認-1),指示在啟動連接、讀取或寫入遠程計算機系統的方法中應使用默認超時值。IdTimeoutDefault通常用作提供給 TIdTCPClient.Connect方法的超時參數的默認值。
描述:
- Connect是使用主機和端口屬性打開到FTP服務器的連接的過程。當需要代理服務器連接時,Connect將嘗試使用ProxySettings中主機和端口屬性的值,但如果發生異常,Connect將恢復為原始主機和端口值。Connect調用繼承的Connect方法來打開連接的物理套接字句柄。
- 當服務器的協議響應代碼為220時,LastCmdResult中的值將分配給Greeting屬性。
- 當AutoLogin為True時,Connect方法將使用Login方法對連接進行身份驗證,並觸發OnAfterLogin事件處理程序。Connect還發送新連接的TransferType,並發送FTP SYST命令以獲取存儲在SystemDesc中的主機FTP服務器。
- 成功完成上述步驟后,Connect使用ftpReady狀態值觸發OnStatus事件處理程序。如果在Connect中引發異常,則Connect調用Disconnect並重新引發應用程序異常處理程序的異常。
2、IdFTP.ReadTimeout - 指示等待可讀連接的毫秒數。
- ReadTimeout是一個整數屬性,指示連接應等待對等連接使用協議堆棧變得可讀的毫秒數。
- ReadTimeout在ReadFromStack中使用。
- IdFTP.ReadTimeout 實際繼承自 TIdTCPConnection.ReadTimeout
注意(個人經驗和理解):
- 以上FTP連接的等待時間,如果只設置connect 的 Timeout 實際無效果,還要設置 ReadTimeout 的值
- Connect的Timeout 是相對於網絡連接通暢的情況下,判斷與服務器的連接所用的超時時間。
- ReadTimeout 是相對於客戶端而言,讀取的超時時間,即使網絡不通暢的情況下照常判斷。
- 如果不設置 ReadTimeout 則FTP的連接Connect 將會是 很長時間,大概30s左右(有時候更久)才會拋出異常,因為它本身的連接是阻塞式的。
創建時間:2021.09.15 更新時間: