2013-04-16 67 views
0

我正在嘗試在Java中創建點對點文件共享網絡。我正在使用UDP連接通過網絡發送數據包。但是我無法通過UDP連接傳輸完整的文件。大多數數據包每次都缺失。如果我以延遲的方式發送數據包,接收機將獲得所有數據包。java中的點對點文件傳輸

這是我發送代碼:

while (fso.hasNextBlock()){ 
    byte[] temp1 =fso.nextBlock(); 
    int size1 = temp1.length; 

    packet=new DatagramPacket(temp1, size1,ipaddress,port); 
    socket.send(packet);       

    // Thread.sleep(100); 
} 

這是接收器代碼:

FileOutputStream out=new FileOutputStream(file); 
byte[] data=new byte[size]; 
DatagramPacket packet=new DatagramPacket(data, data.length); 
int i=0; 
while(true){     
    socket.receive(packet); 
    out.write(packet.getData()); 
    System.out.println("packet "+i); 
    i++; 
    ..... // some codes      
} 

有什麼不對的在我的代碼?
我對對等網絡不熟悉。在文件共享網絡中最好使用TCP或UDP?

+1

這個問題已經回答了一百萬次,例如http://stackoverflow.com/questions/8754489/protocol-recommendation-for-peer-to-peer-file-transfer。請閱讀如何提出問題http://stackoverflow.com/questions/how-to-ask – OldProgrammer

+2

IMO UDP不應該用於發送文件。這是一個更快的協議,但可能會遺漏軟件包。 UDP通常用於流式傳輸音頻或視頻,如果某些軟件包沒有通過轉換,那麼可以使用UDP。 –

回答

4

UDP協議是不可靠的設計。它並不能保證數據包按順序接收和接收。

當你想通過UDP實現一個文件傳輸協議時,你需要自己實現這個。

  1. 前綴序列號
  2. 檢查每一個數據包接收器上的序列號,以避免它們重新組合以錯誤的順序
  3. 當接收機錯過未在合理的時間內收到了序列號,爲接收方實施一些機制,要求發送方轉發它。

或者只是使用TCP,它確實在幕後爲你做。

如果您沒有很好的理由使用UDP進行文件傳輸,那麼請使用TCP,因爲您不必擔心所有這些。 HTTP,FTP和BitTorrent是Internet上使用最廣泛的三種文件傳輸協議,都有使用TCP的原因。

+0

我正在創建一個類似BitTorrent的項目。多個對等方可以將相同的文件發送到單個系統。我認爲UDP更好地實現這樣的系統。 –

+1

@NoufyNoufal你基於這個假設是基於什麼事實? – Philipp

2

你所看到的是由於發送數據的速度比網絡路徑可以處理它的速度更快。 UDP沒有流量控制或丟失恢復。如果您只是將數據包轉儲到網絡中,則路由器隊列會溢出並丟棄一些數據包。這就是減緩損失減少的原因。

要使用UDP進行文件傳輸,您需要實現自己的流量控制和丟失恢復算法。這並不容易做到,做得很好很難。基於UDP的協議通常用於TCP算法崩潰的地方,這是因爲UDP提供了一個乾淨的平臺來實現新的算法。

除非您想深入瞭解網絡傳輸設計理論,否則最好使用TCP或查看已存在的衆多UDP文件傳輸協議之一。

如果你很想好好設計你自己的,我建議你從網絡性能統計的背景開始。我寫了一篇關於這個主題的文章:Loss, Latency, and Speed。本文主要關注網絡性能分析,但也會談到爲什麼網絡的行爲方式如此,這對理解流量控制至關重要。

可以在Wikipedia上找到現有UDP協議的列表。但除非你有一些令人信服的性能原因(或引人注目的好奇心),否則你最好堅持使用TCP。

聲明:我爲生產Multipurpose Transaction Protocol的公司工作。