2012-02-22 48 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; 
      } 

     } 

このループは単にユーザーからのポート番号を受信する前に、コードは、ソケットを設定し、送信されますどのように多くのパケットを指定の送信者から単一のパケットをrecieves。これはpacketNumに格納されます。

大きな画像を送信しようとしたときに誰かが停止する理由は誰にも考えられますか? おかげ

+0

http://stackoverflow.com/questions/9203403/java-datagrampacket-udp-maximumによると最大バッファサイズ制限があるようです-buffer-size –

+0

大きな画像をより小さなパケットに「チャンクアウト」しようとしましたか? –

+0

yeh、私の送信者は、1024バイトのデータグラムに画像を分割し、それぞれを個別に受信者に送信します – sam

答えて

1

あなたは、右を送信しない「受信機は、数百グラムを受信した後、ジャムのようです」という意味しますか?そうであれば、おそらく悪質なUDPパケットの犠牲になるかもしれません! :) 2つのオプションがあります。

  1. 伝送速度を遅くします。
  2. 信頼性の高いUDPを実装します。

最初の方が簡単です。パケットロスが発生しているかどうかをすぐに判断できるはずです。いくつかのテストを実行し、伝送速度を変えることによって(つまり、各パケットを送信する間に小さなスリープ状態にする)、同じ数のバイトを受信して​​いるかどうかを確認します。パケットロスの違いを検出した場合は、信頼性の高いUDPを実装し、シーケンス外パケットまたは欠落パケットの再送信を要求します。

+0

こんにちは私は睡眠を追加し、画像が正常に転送されました。奇妙なことは、0ミリ秒で睡眠を追加すると、それはまだ動作します。 – sam

+0

@sam私は0の睡眠が(おそらく睡眠時間が> 0かどうかを評価するために)処理時間がかかると思います。しかし、これは良い解決策ではありません。信頼性の高いUDPを実装することは、パケットロスを懸念する場合には、はるかに優れた解決策になります。 – Kiril

2

UDPは各パケットで64kBしか処理できません。データをブロックに分割して番号を付ける必要があります。順序が保証されているわけではありません。

本当に、特別な理由がない限り、TCPに切り替える必要があります。それはあなたが持っている問題であなたを助け、あなたがまだ見ていないものもあります。

関連する問題