摘要:介紹了局域網之間傳送大文件的方法。
關鍵詞:局域網 Ftp 斷點續傳
中圖分類號:TP393.1 文獻標識碼:B 文章編號:1002-2422(2008)03-0030-02
1 無斷點續傳機制的分塊傳輸方法
假設發送文件方主機為A,接收文件方主機為B,Ftp服務器為C,A要向B傳遞的大文件為L,B將這個文件在本機上存為D。
(1)A向C上傳一個文件F,F的內容是L的第1部分,然后上傳同步文件S,內容為1,然后等待S的內容變成2:
(2)B一開始則定時向C發出請求查看S文件的內容,如果有這個文件并且內容為1,則下載文件F,保存為D,然后上傳文件S,內容為2,然后等待S的內容為3;
(3)A發現S的內容為2后,上傳文件F,F的內容是L的第2部分,然后上傳文件S,內容為3,然后等待S的內容變成4;
(4)B發現S的內容為3后,下載文件F,附加到文件D后,然后上傳文件S,內容為4,然后再次等待S的內容為5……;
(5)A在上傳L的最后一部分后,上傳文件S,內容為-1,然后等待S的內容為-2;B發現s的內容為-1后,下載文件F,附加到文件D后,然后上傳文件S,內容為-2,然后B主機程序結束;
(6)A發現S的內容為-2后,程序結束。
2 有斷點續傳機制的分塊傳輸方法
網絡是不可靠的,可能因為多種原因導致傳輸中斷。對于大文件來說,重新傳輸是很浪費資源的一件事情,必須做到斷點續傳。
若S的值為2a,則B正在等待S(2a+1),而A在上傳第a+l部分或上傳S(2a+1)時中斷了,則A只需重新上傳第a+l部分開始執行即可,B則從等待S(2a+1)開始。
若S的值為2a-1,則A正在等待S(2a),而B在下載第B部分或上傳S(2a)的時候中斷了,那么B只需從重新下載第a部分開始執行即可,A則從等待S(2a)開始。
這樣就出現了A如何判斷第a+l部分開始于L的哪個字節的問題。同樣也有B如何判斷第a部分開始于D的哪個字節的問題,因為B可能在下載第a部分的中途斷掉了,所以D的文件尾并不一定是第a部分的開始。
解決這個問題的方法是A創建一個文件U,將下一部分的開始字節號寫入U中,而B創建一個文件R,將下一部分的開始字節號寫入R中。
寫入u這一步如果在上傳第a部分后上傳S(2a-1)前執行,那么在上傳S(2a-1)的時候網絡斷掉了,S的值是2a-2,根據以上的論述,中斷后繼續運行的時候A應該上傳第a部分,而這個時候U中存儲的是第a+l部分的開始字節號,那么上傳的其實是第a+l部分,這樣就出現了錯誤。所以寫入U這步必須在上傳S(2a-1)后等待S(2a)前執行。
同理,寫入R這一步如果在下載第a部分后上傳s(2a)前執行,那么如果在上傳S(2a)的時候網絡斷掉了,S的值是2a-1,根據以上的論述,中斷后繼續運行的時候B應該下載第a部分,而這個時候R中存儲的是第a+l部分的開始字節號,那么第a部分就下載到第a+l部分處了,這樣也會出現錯誤。所以寫入R這步也必須在上傳S(2a)后等待S(2a+1)前執行。
這樣程序一開始就要下載S,看S存在與否,如果存在,還要看s的值是多少,然后決定從哪步開始進行斷點續傳。
因為s的值已經決定了程序的開始步驟,所以上傳方還要負責在S為一2后從c上刪除S文件。
3 方法的實現
3.1上傳文件方程序流程
(1)打開文件L,獲得文件L的長度;
(2)從Ftp服務器下載同步文件S,如果S不存在,則將步驟標識s把p賦值為1,將要上傳部分的開始字節數up-size賦值為0,然后轉7;
(3)如果S的內容大于O且為偶數2a,則將step賦為2a+l,并打開文件u,得到要上傳部分的開始字節數upsize,然后將L的文件指針定位到upsize處,然后轉7;
(4)如果S的內容大于0且為奇數2a+1,則將step賦為2a+1,并打開文件U,得到要上傳部分的開始字節數up-8ize,然后將L的文件指針定位到upsize處,然后轉10,
(5)如果S的內容為-1,則轉10:
(6)如果S的內容為-2,則刪除S后程序結束;
(7)上傳指定長度部分(如果剩余字節數不足指定長度,則上傳剩余字節數),并將L的文件指針相應的向后移動上傳字節數;
(8)如果已經到文件尾,則上傳S(-1),否則上傳S(step);
(9)將upsize自加上上傳的字節數并將upsize寫入文件U;
(10)定時查看S,如果S的內容是step,則轉10;
(11)如果已經到文件尾并且s的內容為-2,則刪除S后程序結束;
(12)step自加2,轉7。
3.2下載文件方程序流程
(1)打開文件D:
(2)從Ftp服務器下載同步文件S,如果S不存在,則將步驟標識step賦值為0,將要上傳部分的開始字節數downsize賦值為0,然后轉7;
(3)如果S的內容大于O且為偶數2a,則將step賦為2a,并打開文件R,得到要上傳部分的開始字節數downsize,然后將D的文件指針定位到downsize處,再轉7;
(4)如果S的內容大于0且為奇數2a+l,則將step賦為2a,并打開文件R,得到要上傳部分的開始字節數down-size,然后將D的文件指針定位到downsize處,然后轉8:
(5)如果S的內容為-l,則將step賦值為-1,再轉8;
(6)如果S的內容為-2,則程序結束;
(7)定時查看S,如果s的內容不是step+l或-l,則轉7;
(8)下載文件F,并寫入文件D:
(9)如果S內容為-1,則上傳S(-2)并結束,否則sup自加2,并上傳S(step);
(10)將downsize自加上下載的字節數并將downsim寫入文件R;
(11)如果S內容為-1,則程序結束,否則轉7。