Java 使用 TCP 和 UDP 傳輸檔案

spasvo發表於2013-12-23

  引言
本專案的目的是實現兩個應用,透過網路連線在不同的主機之間傳輸一個檔案的功能。兩個應用應該分別利用 UDP 和 協議,以具有傳輸至少 1 MB 檔案的能力。
實現和說明
原始碼
兩個應用都由單個程式實現,原始碼下載地址。
說明
程式使用以下命令列進行編譯:
javac *.java
然後使用以下兩個命令列執行:


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

  其中 [protocol] 引數可以是 "udp" 或者 "tcp",但 sender 和 receiver 必須一致。
檔案將會在 receiver 啟動的目錄下生成,預設指定名為 "Received-[filename]"。
TCP 實現
實現概述
在 TCP 實現中,Receiver 開啟了一個 ServerSocket,並對定義好的埠進行監聽。Sender 啟動後將會為監聽者 Receiver 開啟一個新的 Socket,這導致了 socket 兩端 InputStream 和 OutputStream 物件的建立。
一個包含了檔名和檔案大小的初始資訊將由 Sender 傳送給 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 使用經驗
   是一種不可靠的傳輸連續資料的協議。這意味著傳輸過程中會有丟包,而且接收到包的次序也是隨機的。上面的例子並沒有解決檔案傳輸中的這些問題。這意味著以 上應用在其每次執行時(所得到的檔案)並不是正確的和完整的。以下是關於兩個經常發生的問題的原因以及可行解決方案的描述。
如果在檔案傳輸過程中兩個包接收順序錯誤,而寫入檔案的順序是按接收順序來的。這將造成接收檔案損壞。對於這種問題的解決方案是每次傳輸時定義一個序列號。這可以讓 Receiver 按照正確的順序來儲存這些包,不管它們到達的先後次序。
如果傳輸檔案時出現丟包,Receiver 將不能收到它所期望數量的資料。在上面的示例中,這會導致 Receiver 繼續執行,等待剩餘的資料。對於這個問題一個可行的解決方案是,receiver 在給定時間跨度之後進行每次傳輸,呼叫超時。但為了使此次請求具有目的性,我們要像上面說的那樣為包擴充套件序列號。否則我們無法接收到給定數量的資料,並局 限於請求檔案的完整傳輸。
另一個關於這兩個問題的,在每次正確接收包之後再向 sender 發起接收請求。這個方法消除了丟包的可能性,但卻會使傳輸異常緩慢。
結語
上面的實現讓檔案在主機之間傳輸變得可行。但如果使用的是 UDP 協議的話,我們就無法保證檔案的完整性和接收(順序)的正確性。我們對解決這些問題進行了大體說明,但具體在實際的檔案傳輸中,對這些問題的最簡單的解決方案就是,用 TCP 取代 UDP。

  本文轉自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29379530/viewspace-1064050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章