UDPを使った帯域測定プログラムの作成方法

このQ&Aのポイント
  • UDP通信を利用して帯域測定プログラムを作成する方法を教えてください。
  • 質問者はJavaのeclipse3.5を使用しているそうです。
  • プログラムの構造や書き方について具体的なアドバイスをお願いします。
回答を見る
  • ベストアンサー

UDPを使って帯域測定プログラムを作りたいのですが

Java eclipse3.5を使っています。 UDP通信を使って帯域測定プログラムを作りたいと思っています。 動作の流れは、 1.クライアント側で送信データ(1MB,5MB,10MBのバイト)を作成し、それをサーバに送信する。 2.サーバ側では、送られた各データを受け取る(読み取る?)時間をそれぞれ計測し、計測時間をクライアント側に送信する。 3.クライアント側で、送信データ÷計測時間で通信速度を計算する。 4.それを表示する。 という感じにしたいと考えています。 頭では、こうしたいという構造はあるのですが、プログラムを書くとなると、どう書けばよいか分かりません。 どなたか、アドバイスをいただけないでしょうか?

  • Java
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.1

通信の仕方がまったく分からない、ということでしょうか。 であれば「java udp ソース」などで検索すればサンプルコードが見つかるので、それを参考にするとよいと思います。下記URLは一例です。 http://www.hellohiro.com/datagram.htm

debukawa
質問者

お礼

komi1341さん、回答ありがとうございます。 早速教えていただいたサイトを見させていただきました。 このサイトにあるサンプルコードに書かれている byte buf[] = "Hello World".getBytes();の部分で、 バイトに変換しているのですよね? 私は、例えばですが1MBのバイトを送信したいのですが、 その場合、どう書けばよいのでしょうか?

その他の回答 (2)

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.3

> この部分を > byte[] buf = new byte[1000000]; > と変更すればよいのでしょうか? 試せばすぐ分かるはずですが…自分で手を動かしてますか? サンプルコードをコンパイルして実行してみましたか? プログラムは頭で考えるだけでは完成しないので、まずはご自身で試行錯誤してみてください。

debukawa
質問者

お礼

回答ありがとうございます。 試行錯誤していますが、うまく作成できません。 ひとまず、こちらの質問は締めさせていただきます。 また、違うかたちでこの件に関する質問をさせていただいて いますので、そちらの方で、分かることがございましたら、 またアドバイスをお願いします。

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.2

> 私は、例えばですが1MBのバイトを送信したいのですが、 > その場合、どう書けばよいのでしょうか? byte型の変数はサイズが1byteなので、byte型の配列なら配列サイズがそのままデータ量になります。なので byte[] buf = new byte[1000000]; という配列ならサイズが1MBになります。 送信データを決めてからの送受信方法は、サンプルソースと同じですね。

debukawa
質問者

お礼

komi1341さん、回答ありがとうございます。 サンプルコードの送信側では、 byte buf[] = "Hello World".getBytes(); となっていますが、この部分を byte[] buf = new byte[1000000]; と変更すればよいのでしょうか?

関連するQ&A

  • UDPを使って通信速度測定プログラムを作成

    java eclipse3.5を使って通信のプログラムを作っています。 TCPの通信速度計測プログラムはWebサイトのソースを参考にして、自分で作りました。 次は、UDPの通信速度計測プログラムを作りたいのです。 TCPでは、送信側で送信データを作成して、受信側で時間を測ります。 データの作成方法と、時間の計測方法は次のようにしています。 送信側: for (int i = 0; i < data - 2; i++) { out.write('X'); } out.write('\\'); out.write('s'); out.flush(); int recvMicroSecond = Integer.parseInt(in.readLine()); System.out.println(data + "バイトを送信するのに" + recvMicroSecond + "マイクロ秒かかる。"); System.out.println(); 送信側で作成したデータ:XXXX…XX\\s 受信側では、最初のXを読み込んだ時点で時間の計測を開始し、sを読み込んだら計測時間をストップして、計測時間を測っています。 UDPでも送信側でこのようなデータをバッファに格納して、 受信側でバッファ内の文字を読み込んで時間の計測を行いたいのですが、 どのクラスの、どのメソッドを使ったらよいか分かりません。 どなたか、よい方法を知りませんか?

    • ベストアンサー
    • Java
  • 帯域測定プログラムに関する質問

    eclipse3.5を使ってプログラムを作っています。 TCPとUDPの2種類で帯域測定プログラムを作りたいのです。 構成としては、送信するバイトと、測定開始時間を指定したら、 自動的に指定した時間に指定したバイトを送信し、帯域測定を 行うプログラムを作りたいのです。 プログラムの引数として、IPアドレス、ポート番号、バイト量、開始時間 というようにしています。 バイトを指定することは簡単にできたのですが、計測時間は、どう指定 すればよいか分かりません。表記の仕方が分かりません。 Ms=System.currentTimeMillis(); System.out.println(Ms); で現在の時間の表記の仕方を確認しても、私にはでたらめな数値にしか見えず、 これでは指定時間を入力することができません。 どなたか、どうやれば指定した時間に測定を開始することができるか わかりませんか?アドバイスお願いします。

    • ベストアンサー
    • Java
  • UDPで受信スループットを測定

    Javaを使って通信のプログラムを勉強しています。 UDP通信のスループットを測定するプログラムを作成しています。 送信側で5242880バイトを128回に分割して送信して、 受信側でそれらのパケットを受信する時間を計測するプログラムを 作りたいのですが、受信側でどのタイミングで受信処理を止めるのかがわかりません。 start = System.currentTimeMillis(); for(;;){   socket.receive(RecvPacket);   if(ループを抜ける条件)     break; } stop = System.currentTimeMillis(); で受信し続けて、受信するパケットがなくなったらループを抜けるというように考えました。 UDPでは送信されたパケットがすべて届くという保証はないので、 128回受信したらループを抜けるというようにできないので、困っています。 届いたパケットの数も数えて到達率も計算したいです。 受信が終わったら、ループを抜けるというようにしたいのですが、 どうすればよいでしょうか?

    • ベストアンサー
    • Java
  • UDPパケットの分割について

    こんにちは。 現在、クライアント&サーバの通信プログラムを作成しています。 クライアントがサーバに接続しにいく際、サーバの待ち受けポートにクライアントが UDPでブロードキャストしています。 その際、クライアントの情報もUDPに乗せて、送信しています。 ここで、問題なのですが、ネットワークモニタで通信データを見てみると、 クライアントから送信するUDPデータが1500バイト?を超えると、UDPパケットの分割が行われ、 2つめのデータが、UDPではなく、IPで送信されています。 しかも、2つめのIPのパケットがサーバ側に届くケースと届かないケースがあるように見受けられます。 (環境の違いかもしれません。) 2つめのパケット破棄は破棄が起こる環境では必ず起きます。 破棄が起きない環境では一回も起こりません。 スイッチ、NIC等で、破棄することってあるのでしょうか? ネットワーク上の問題っぽいので、OSの違い(Win2K pro,Win2k advanced server) などには関係ないですよね? どなたが、ご存知の方がおられましたらご教授願います。

  • UDPの接続って?

    Linuxとgccでプログラムしているのですが、 UDPによるデータ送受信で悩んでいます。 (すいません、前回も同じようなこと言いましたね(^^;) TCPであれば、サーバ側は 1.ソケット生成 2.バインド クライアント側は 1.ソケット生成 2.コネクト で通信路が確立されますよね。 UDPはどうなるんでしょうか。コネクションを張らないということは、サーバとクライアントは区別しないんですか? 今現在、TCPのプログラムのSOCK_STREAMとIPROTO_TCPの部分だけをUDPにして実行しているのですが、UDPのくせに Connectとかやってて気分が良くないのです・・・。(笑) 現在は、SetupForClient(サーバ側)とConnectToServer(クライアント側)というTCPの接続関数をそのまま使っています。前者はいいのですが、後者は明らかにUDP向けではないですよね。 もし、クライアント側の例があったら、教えていただければ嬉しく思います。

  • パケット到達遅延の測定にて

    Javaを使って通信のプログラムを勉強しています。 UDP通信プログラムでパケット到達遅延を測定したいと考えています。パケット到達遅延を測定するには、 送信側がパケットを送信した時間と、受信側がそのパケットを受信した時間を取得して、 求めようと考えています。 パケット到達遅延を測定するには、送信側と受信側が時刻同期させる必要があると聞きました。 その方法を教えていただきたいのですが、どなたかアドバイスをいただけないでしょうか?

    • ベストアンサー
    • Java
  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • UDP:送信レートについて

    UDPで帯域測定プログラムを作りました。 このプログラムは、送信側で10000個のパケットを送信して、 受信側でスループット、パケット到達率、パケット到達間隔を測定するものです。 このプログラムに送信側で送信レートという機能を追加したいのです。 送信レートは、1秒間に何バイトのパケットを何個送ったかというものですよね? 私は1秒間に100個のパケットを送信しようと考えています。 私が考えたのは、100個のパケットを送る処理と一緒に、無駄なループを追加するということです。 こうすることで無駄なループで時間を稼ぐことができます。1秒に近づくようにループを調節すればよいと考えました。 時間を稼ぐためのループを作りたいのですが、ループの中はどう書いたらよいでしょうか? また、ほかに良い方法があれば、アドバイスをいただきたいです。

    • ベストアンサー
    • Java
  • ネットワーク帯域測定を行う理由

    なぜネットワーク帯域測定を行うのかを考えているのですが、 情報化社会の現状をあまりしらないのでしっくりくる答えが出ません。 私が考えたネットワーク帯域測定を行う理由は、 ・帯域を測定することで帯域幅の小さい部分を知ることが出来、  その部分を補うために通信回線を太くする。 ・帯域幅に見合ったサイズのデータを選択して通信できる。 といった考えしか浮かびません。 帯域測定を行うことで、どんな利点があって、それが現状の課題に どう結びつくかということを分かる方はいないでしょうか? アドバイスをお願いします。

    • ベストアンサー
    • Java
  • UDPの信頼性について

    UDPでは、信頼性のない通信プロトコルとされていますが、あるノード内の2つのプログラム間でUDPを使用した通信(ローカル通信)をした場合も、信頼性がない通信となるのでしょうか? ここでいう信頼性とは下記を意味しています。 ・ 送信した順序で、受信側が受信する。 ・ 送信したメッセージを、1つも失うことなく受信側で受信できる。

専門家に質問してみよう