Java 使用 TCP 和 UDP 傳輸文件

  引言
     本項目的目的是實現兩個應用,經過網絡鏈接在不一樣的主機之間傳輸一個文件的功能。兩個應用應該分別利用 UDP 和 TCP 協議,以具備傳輸至少 1 MB 文件的能力。
     實現和說明
     源代碼
     兩個應用都由單個程序實現,源代碼下載地址。
     說明
     程序使用如下命令行進行編譯:
     javac *.java
    而後使用如下兩個命令行運行:html


 Receiver:
 # java FileReceiver [protocol] [port]
 Sender:
 # java FileSender [protocol] [host] [port] [filename]java

  其中 [protocol] 參數能夠是 "udp" 或者 "tcp",但 sender 和 receiver 必須一致。
     文件將會在 receiver 啓動的目錄下生成,默認指定名爲 "Received-[filename]"。
   TCP 實現  
   實現概述  
   在 TCP 實現中,Receiver 打開了一個 ServerSocket,並對定義好的端口進行監聽。Sender 啓動後將會爲監聽者 Receiver 打開一個新的 Socket,這致使了 socket 兩端 InputStream 和 OutputStream 對象的建立。
   一個包含了文件名和文件大小的初始信息將由 Sender 發送給 Receiver。這樣 Receiver 可使用一個有意義的名字來存儲接收到的文件,並能夠判斷何時文件徹底傳輸完畢。此信息並非必須的,當 Receiver 沒法接收文件時中止 Sender 佔用沒必要要的帶寬。  
   文件經過一個 FileInputstream 對象對它的讀取進行傳輸,而後將數據寫到一個 Socket 返回的 OutputStream 對象。爲提升應用效率,每次讀取和中繼的數據是 8 kb,使用一個字節數組做爲緩存。  
   TCP 使用經驗  
   實踐證實,TCP 文件傳輸是簡單可靠的。程序的效率取決於使用的緩存大小,但傳輸的文件在全部執行的測試中都準確地被接收和保存。  
   UDP 實現  
   實現概述  
   UDP 文件傳輸的實現使用的是標準 Java datagram 類:DatagramPacket 和 DatagramSocket。  
   當 receiver 被執行時,它打開一個指定端口號的 socket 並等待,監聽傳入的數據包。sender 啓動後,它打開一個鏈接到指定主機和端口的 socket,並傳輸包含有文件名以及將要傳輸文件大小等信息的單個 packet。當這個 package  發送之後,這個 socket 將等待並監聽 package。  
   基於接收到的初始 package,receiver 爲文件建立一 outputStream 對象,並給監聽着的 sender 發送一個含有   "OK" 單詞的 package。收到這個 "OK" 包之後,sender 開始讀取文件內容,並將其經過 UDP 數據包發送,每次含有 512 字節的塊。receiver 將這些塊按照接收到的次序寫入文件,並重復接收,直到接收到的字節達到它所指望數字。以後程序終止。
   UDP 使用經驗  
  UDP 是一種不可靠的傳輸連續數據的協議。這意味着傳輸過程當中會有丟包,並且接收到包的次序也是隨機的。上面的例子並無解決文件傳輸中的這些問題。這意味着以 上應用在其每次運行時(所獲得的文件)並非正確的和完整的。如下是關於兩個常常發生的問題的緣由以及可行解決方案的描述。  
   若是在文件傳輸過程當中兩個包接收順序錯誤,而寫入文件的順序是按接收順序來的。這將形成接收文件損壞。對於這種問題的解決方案是每次傳輸時定義一個序列號。這可讓 Receiver 按照正確的順序來存儲這些包,無論它們到達的前後次序。  
   若是傳輸文件時出現丟包,Receiver 將不能收到它所指望數量的數據。在上面的示例中,這會致使 Receiver 繼續運行,等待剩餘的數據。對於這個問題一個可行的解決方案是,receiver 在給定時間跨度以後進行每次傳輸,調用超時。但爲了使這次請求具備目的性,咱們要像上面說的那樣爲包擴展序列號。不然咱們沒法接收到給定數量的數據,並局 限於請求文件的完整傳輸。  
   另外一個關於這兩個問題的解決方案,在每次正確接收包以後再向 sender 發起接收請求。這個方法消除了丟包的可能性,但卻會使傳輸異常緩慢。  
   結語  
   上面的實現讓文件在主機之間傳輸變得可行。但若是使用的是 UDP 協議的話,咱們就沒法保證文件的完整性和接收(順序)的正確性。咱們對解決這些問題進行了大致說明,但具體在實際的文件傳輸中,對這些問題的最簡單的解決方案就是,用 TCP 取代 UDP。數組

  本文轉自:http://www.spasvo.com/news/html/2013122394955.html 緩存

相關文章
相關標籤/搜索