Java 使用 TCP 和 UDP 傳輸檔案
引言
本專案的目的是實現兩個應用,透過網路連線在不同的主機之間傳輸一個檔案的功能。兩個應用應該分別利用 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 傳輸層協議 TCP 和 UDP協議TCPUDP
- 加速檔案傳輸:檔案和UDP之間的區別UDP
- Java對檔案的操作及UDP,TCPJavaUDPTCP
- Java傳輸檔案使用Base64優化傳輸速率。Java優化
- wtfpd檔案傳輸使用
- TCP 和 UDPTCPUDP
- TCP和UDPTCPUDP
- 【測試】echo傳送和接收TCP/UDP資料包|shell 傳送TCP/UDP資料包TCPUDP
- 【多檔案自平衡雲傳輸】使用展示 —— 檔案傳輸系統
- 鐳速傳輸淺談TLS 和檔案傳輸TLS
- 在java中使用SFTP協議安全的傳輸檔案JavaFTP協議
- TCP和UDP比較TCPUDP
- TCP和UDP協議TCPUDP協議
- UDP和TCP以及HTTPUDPTCPHTTP
- TCP和UDP對比TCPUDP
- 什麼是極速檔案傳輸,極速檔案傳輸如何進行大檔案傳輸
- 聊聊UDP、TCP和實現一個簡單的JAVA UDP小DemoUDPTCPJava
- 使用Java NIO 和 NIO2實現檔案輸入/輸出Java
- Linux 檔案傳輸Linux
- sftp 傳輸檔案FTP
- scp 傳輸檔案
- 還在使用檔案傳輸協議傳輸機密檔案?你可能是對檔案傳輸協議有什麼誤會協議
- 大檔案如何傳輸,大檔案的傳輸方式有哪些?
- UDP和TCP的差異UDPTCP
- tcp和udp的區別TCPUDP
- windows伺服器傳輸檔案神器——FileZilla 安裝和使用Windows伺服器
- 檔案傳輸協議的五種安全檔案傳輸替代方案協議
- 什麼是高延遲檔案傳輸?為什麼要使用高延遲檔案傳輸
- 鐳速傳輸升級,別再用Email和FTP傳輸檔案了AIFTP
- 鐳速傳輸:如何快速傳輸大檔案?
- python 中的UDP和TCP(1)PythonUDPTCP
- TCP和UDP是如何工作的TCPUDP
- TCP 和 UDP 協議簡介TCPUDP協議
- TCP可靠傳輸原理TCP
- 什麼是檔案傳輸,介紹檔案傳輸的發展程式
- 有了大檔案傳輸加速功能,不再擔憂傳輸大檔案
- 如何快速傳輸大檔案:4 種大檔案傳輸有效的方法
- 如何將超大檔案傳輸給別人,超大檔案如何傳輸呢?
- Android程式設計師必知必會的網路通訊傳輸層協議——UDP和TCPAndroid程式設計師協議UDPTCP