dポイントプレゼントキャンペーン実施中!

javaを使って通信の勉強をしています。

UDPを用いた通信のプログラムを作成しています。
送信側では、次のようにして送信したいバイト数を分割して送信しています。

BUF_MAX = 40960;
DatagramSocket socket = new DatagramSocket();

// data分のバイトデータを分割して送信する。
int part = 5242880 / BUF_MAX; // 分割して送信する回数
send_start = System.nanoTime();
for(int i = 0;i < part;i++){
  byte[] buf = new byte[BUF_MAX];
  buf[0] = (byte)i;
  DatagramPacket sendPacket = new DatagramPacket(buf,BUF_MAX,serverAddress,servPort);
  total += BUF_MAX;
  // 指定したバイト数を送信する。
  try{
    socket.send(sendPacket);
  }catch(IOException e){
    System.out.println(e);
  }
}
System.out.println(total);

このようにしています。
こうする理由は、5242880バイトのデータを128回に分割して送信して、
受信側で受信したパケットの最初の文字を見て、何個目のパケットが届いていないかを確認するためです。

受信側でこれらのデータを受信する方法を考えているのですが、どうすればよいか分かりません。

receive(packet)で受信するのは知っています。
送信された複数のデータを受信するのに、
for(int i = 0;i < 128; i++){
 receive(packet);
}
というようにするのでしょうか?このようにすると、
このループを抜けることができません。それは、パケットが通信途中で紛失するため、128回受信しないからだとおもいます。

受信しなくなったらループを抜けるというようにすればよいとおもいますが、その方法が分かりません。


どなたかアドバイスをいただけないでしょうか?お願いします。

A 回答 (1件)

案1)時間内に届かなかったらタイムアウトさせる。



案2)届かなかったパケットを再送させるよう、送信元と受信先が双方向にやり取りするようにプログラミングする。

案3)TCPを使う(timeoutは必要)。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

提案していただいた案1でやってみようと思います。

時間内に届かなかったらループを抜けるというようにしたいです。
setSoTimeout();で時間を指定することは調べたのですが、
これをどう応用するのかわかりません。
アドバイスをお願いします。

お礼日時:2009/11/29 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!