利用Indy的TIdFtp控件實現(xiàn)FTP協(xié)議

字號:

考試大計算機等級站整理收集:
    現(xiàn)在很多應用都需要上傳與下載大型文件,通過HTTP方式上傳大文件有一定的局限性。幸好FTP作為一個非常老而且非常成熟的協(xié)議可以高效穩(wěn)定地完成大文件的上傳下載,并且可以完美地實現(xiàn)續(xù)傳。就拿我寫的電影服務器管理端程序來說,各種方案比較后,發(fā)現(xiàn)使用FTP可以完美地實現(xiàn)要求。但是要通過WinSocket庫實現(xiàn)FTP比較麻煩,幸好有Indy--一個包裝了大多數(shù)網(wǎng)絡(luò)協(xié)議的組件包。
    通過Indy,程序設(shè)計人員可以通過阻塞方式進行編程,可以拋開蹩腳的Winsocket異步模式,采用與Unix系統(tǒng)上等同的阻塞編程模式進行。這樣,程序員就可以很好的處理程序的運行流程。 下面,我們進入到Indy的TIdFtp世界。
    1.控件的說明
    使用Indy 9中的TIdFtp控件可以實現(xiàn)通過FTP方式進行文件的上傳與下載。
    2.控件的具體使用
    (1)控件屬性設(shè)置
    默認屬性即可,與服務器連接直接相關(guān)的屬性如主機名與用戶等在建立連接時進行設(shè)定。需要設(shè)定的是RecVBufferSize和SendBufferSize兩屬性的值。另外需要根據(jù)要傳輸?shù)奈募愋椭付═ransferType屬性,而其他屬性按默認值設(shè)定即可。
    RecvBufferSize說明(默認值為8192字節(jié)):該屬性為整型變量,用于指定連接所用的接受緩沖區(qū)大小。
    SendBufferSize說明(默認值為32768字節(jié)):該屬性也為整型變量,用于指定連接所用的發(fā)送緩沖區(qū)的值。該屬性在WriteStream方法中時,可用于TStream指定要發(fā)送內(nèi)容的塊數(shù)。如果要發(fā)送的內(nèi)容大于本屬性值,則發(fā)送內(nèi)容被分為多個塊發(fā)送。
    TransferType說明(默認值為ftBinary):該屬性為TIdFTPTransferType型變量。用于指定傳輸內(nèi)容是二進制文件(ftBinary )還是ASCII文件(ftASCII)。應用程序需要使用二進制方式傳輸可執(zhí)行文件、壓縮文件和多媒體文件等;而使用ASCII方式傳輸文本或超文本等文本型數(shù)據(jù)。
    (2)控件的事件響應
    OnDisconnected響應:TNotifyEvent類,用于響應斷開(disconnect)事件。當Disconnect方法被調(diào)用用來關(guān)閉Socket的時候,觸發(fā)該響應。應用程序必須指定該事件響應的過程,以便對該斷開事件進行相應。
    OnStatus響應:TIdStatusEvent類。該響應在當前連接的狀態(tài)變化時被觸發(fā)。該事件可由DoStatus方法觸發(fā)并提供給事件控制器屬性。axStatus是當前連接的TIdStatus值;aaArgs是一個可選的參數(shù)用于格式化函數(shù),它將用于構(gòu)造表現(xiàn)當前連接狀態(tài)的文本消息。
    OnWork響應:OnWord是TWorkEvent類事件的響應控制器。OnWork用于關(guān)聯(lián)DoWork方法當緩沖區(qū)讀寫操作被調(diào)用時通知Indy組件和類。它一般被用于控制進度條和視窗元素的更新。AWorkMode表示當前操作的模式,其中:wmRead-組件正在讀取數(shù)據(jù);wmWrite-組件正在發(fā)送數(shù)據(jù)。AWorkCount指示當前操作的字節(jié)計數(shù)。
    OnWorkBegin響應:TWorkBeginEvent類。當緩沖區(qū)讀寫操作初始化時,該事件關(guān)聯(lián)BeginWork方法用于通知Indy組件和類。它一般被用于控制進度條和視窗元素的更新。AWorkMode表示當前操作的模式,其中:wmRead-組件正在讀取數(shù)據(jù);wmWrite-組件正在發(fā)送數(shù)據(jù)。AWorkCountMax用于指示發(fā)送到OnWorkBegin事件的操作的字節(jié)數(shù),0值代表未知。
    OnWorkEnd響應:TWorkEndEvent類。當緩沖區(qū)讀寫操作終止時,該事件關(guān)聯(lián)EndWork方法用于通知Indy組件和類。AWorkMode表示當前操作的模式,其中:wmRead-組件正在讀取數(shù)據(jù);wmWrite-組件正在發(fā)送數(shù)據(jù)。AWorkCount表示操作的字節(jié)數(shù)。
    在事件響應中,主要通過上述五種事件響應來控制程序。在一般情況下,在OnDisconnected中設(shè)定連接斷開的界面通知;在OnStatus中設(shè)定當前操作的狀態(tài);在OnWork中實現(xiàn)傳輸中狀態(tài)條和其他參數(shù)的顯示;而在OnWorkBegin和OnWorkEnd中分別設(shè)定開始傳輸和傳輸結(jié)束時的界面。
    (3)連接遠程服務器
    完成了設(shè)定控件屬性和實現(xiàn)了控件的事件響應后,就可以與服務器進行交互和傳輸了。在連接之前,應首先判斷IdFtp是否處于連接狀態(tài),如果Connected為False,則通過界面控件或其他方式指定與服務器連接相關(guān)的一些TCP類屬性的設(shè)置,分別是:Host(主機名):String、Username(用戶名):String、Password(密碼):String,也可以指定Port(端口)。之后調(diào)用Connect方法連接遠程服務器,如果無異常出現(xiàn)則連接成功建立。
    過程說明:procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);
    該過程連接遠程FTP服務器
    屬性:AAutoLogin: boolean = True
    連接后自動登錄,該參數(shù)默認為True。
    const ATimeout: Integer = IdTimeoutDefault
    超時時間,單位:秒。
    示例代碼:
    if IdFTP1.Connected then
    try
    if TransferrignData then IdFTP1.Abort;
    IdFTP1.Quit;
    finally
    end
    else
    with IdFTP1 do try
     Username := UserIDEdit.Text;
     Password := PasswordEdit.Text;
     Host := FtpServerEdit.Text;
     Connect;
     ChangeDir(CurrentDirEdit.Text);
     finally
    end;