FTP客戶端實現(xiàn)要建立兩個通道,一個控制命令通道,讓FTP服務(wù)器知道客戶端要干什么,一個數(shù)據(jù)傳輸通道。所謂的兩個通道只不過是兩個調(diào)用了connect函數(shù)的連接,只是控制命令通道專門用來傳輸一些字符串命令信息,而數(shù)據(jù)通道則是用來傳輸文件??刂泼钔ǖ酪欢ㄊ怯煽蛻舳讼蚍?wù)器的連接(默認的端口是21,也可以指定端口,這要看服務(wù)器的設(shè)置)。連接的過程完成了FTP的登錄。數(shù)據(jù)通道則不一定啦,具體哪個連哪個,請看下面對PASV命令的解釋。
其實FTP斷點續(xù)傳的原理很簡單,可分為斷點下載和斷點上傳。
客戶端的實現(xiàn)步驟如下:
一、下載:
1、向服務(wù)器發(fā)送“REST + 本地文件長度”命令,告訴服務(wù)器,客戶端要斷點下載了。這時服務(wù)器還不知道客戶端要下載哪個文件;
要實現(xiàn)FTP的斷點續(xù)傳,F(xiàn)TP服務(wù)器必須支持REST指令,這條指令在FTP協(xié)議文本RFC959中就已經(jīng)定義了,不過它不是FTP服務(wù)器必須支持的指令。一般,你可以在下載前使用REST 100命令進行實驗,如果服務(wù)器正常執(zhí)行了這條命令,說明該服務(wù)器支持FTP斷點續(xù)傳。REST后面跟的數(shù)表示下載文件的起始位置,而REST 0表示從文件最開始處下載。REST命令本身并不執(zhí)行下載功能,你仍需要使用RETR命令執(zhí)行下載工作。
2、向服務(wù)器發(fā)送“RETR + 文件名”命令,通知服務(wù)器要下載的文件名,這時服務(wù)器開始定位文件指針讀文件并發(fā)送數(shù)據(jù)。
3、客戶端定位本地文件指針(文件末尾);
4、兩端的準備工作都做完了以后,客戶端創(chuàng)建socket,以被動或非被動方式建立數(shù)據(jù)通道,循環(huán)調(diào)用recv接收數(shù)據(jù)并追加入本地文件;
二、上傳:
1、獲取服務(wù)器上和本地要上傳文件的同名文件大?。?nbsp;
2、向服務(wù)器發(fā)送“APPE + 文件名”,通知服務(wù)器,接下來從數(shù)據(jù)通道發(fā)送給你的數(shù)據(jù)要附加到這個文件末尾。
3、定位本地文件指針(和FTP上文件大小相同的位置)
4、從文件指針處讀數(shù)據(jù)并發(fā)送。
好了,F(xiàn)TP斷點續(xù)傳的原理就這么簡單。代碼里將斷點上傳和斷點下載放到同一個函數(shù)(MoveFile)里,通過get參數(shù)說明是上傳還是下載。當然,整個FTP類的實現(xiàn)有800多行,包括登錄、退出、獲取FTP文件大小、刪除FTP服務(wù)器上文件、響應(yīng)服務(wù)器,解析響應(yīng)信息等函數(shù)。相應(yīng)的注釋代碼里都有,這里就不一一熬述了。
這里重點說說PASV模式,即被動模式,這是FTP命令里比較不容易理解的一個,這條命令請求服務(wù)器在某個端口(非FTP默認端口或控制命令端口)創(chuàng)建一個監(jiān)聽socket,服務(wù)器創(chuàng)建的端口號會在客戶端的控制命令通道上得到響應(yīng)。得到這個端口號后,客戶端就可以創(chuàng)建新的socket(數(shù)據(jù)通道)connect過去,并進行文件傳輸?shù)裙ぷ鳌7駝t,如果為非被動模式,那么監(jiān)聽的socket由客戶端創(chuàng)建,服務(wù)器connect過來。
對于這條命令的存在我是這么理解的,存在這么一種情況:客戶端的IP是個內(nèi)網(wǎng)的IP,服務(wù)器的IP是個外網(wǎng)的,當進行數(shù)據(jù)傳輸時內(nèi)網(wǎng)的IP對于服務(wù)器是不可見的,只有由服務(wù)器啟動監(jiān)聽socket才能建立數(shù)據(jù)通道,所以必須以被動模式進行。:)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。