2012-02-22 80 views
1

我想通過使用JAVA的UDP發送圖像。我設法實現了發送者和接收者,它適用於小圖片(在這種情況下爲18KB)。當我嘗試發送更大的圖像(2MB)時,接收器在發送幾百個數據報後似乎會堵塞。無法通過udp發送大圖像文件

這裏是我的接收器中的迴路,它接收來自發送器的每個包。

while(true) { 
      packetCount++; 
      System.out.println("PKT: " + packetCount); 
      receievePacket = new DatagramPacket(recieveData, recieveData.length); 

      try { 
       receieveSocket.receive(receievePacket); 
      } catch (IOException e) { 
       System.out.println("Error receieving packet"); 
       e.printStackTrace(); 
      } 

      bos.write(recieveData, 0, (int) DATAGRAM_MAX_SIZE); 
      // Terminate loop if last packet received 
      if (packetCount == packetNum) { 
       break; 
      } 

     } 

在此之前剛剛環路接收來自用戶的端口號的代碼,建立所述插座和從指定多少分組要發送到的發送者臨危單個分組。這存儲在packetNum中。

任何人都可以想到爲什麼它試圖發送更大的圖像時停滯的原因? 感謝

+0

看起來像有一個最大的緩衝區大小限制根據http://stackoverflow.com/questions/9203403/java-datagrampacket-udp-maximum -buffer-size – 2012-02-22 18:54:52

+0

您是否嘗試將較大的圖像「分塊」成較小的數據包? – 2012-02-22 18:57:10

+0

你好,我的發件人把圖片分割成1024字節的數據報,並分別發送給接收者 – sam 2012-02-22 19:00:15

回答

1

你的意思是「接收器似乎後果醬接收幾百數據報,」不發送,對不對?如果是這樣的話,那麼你可能會成爲臭名昭着的UDP數據包丟失的受害者! :)有兩種選擇:

  1. 減慢傳輸速率。
  2. 實現可靠的UDP。

第一個更容易做,它應該允許您快速確定您是否正在經歷數據包丟失。運行一些測試,看看您是否通過改變傳輸速率來接收相同數量的字節(即在發送每個數據包之間放置一個小的睡眠)。如果您檢測到數據包丟失的差異,則實施可靠的UDP並請求重新發送無序或丟失的數據包。

+0

嗨,我添加了睡眠,它工作,圖像傳輸正常。奇怪的是,如果我添加一個0毫秒的睡眠,它仍然可以工作 – sam 2012-02-22 20:59:19

+0

@sam我認爲0的睡眠仍然需要處理時間(可能是爲了評估睡眠時間是否大於0)並且可能已經足夠。然而,這不是一個好的解決方案 - 如果您擔心數據包丟失,實施可靠的UDP將是一個更好的解決方案! – Kiril 2012-02-22 21:17:27

2

UDP只能處理每個包中的64kB。你需要將數據分成塊並給它們編號,因爲它們不能保證順序到達。

但是,實際上,除非有特殊原因,否則應該切換到TCP。它可以幫助你解決你有的問題,還有一些你還沒有看到:)