帯域測定プログラムを作成する方法について

このQ&Aのポイント
  • eclipse3.5を使用してTCPとUDPの2種類の帯域測定プログラムを作成する方法についてご教示ください。
  • プログラムの引数としてIPアドレス、ポート番号、バイト量、開始時間を指定する方法について教えてください。
  • 現在の時間を指定する方法について説明していただけませんか?
回答を見る
  • ベストアンサー

帯域測定プログラムに関する質問

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

  • Java
  • 回答数4
  • ありがとう数6

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

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

> 2009/01/01/01 00:00:00をミリ秒に変換する方法 java.util.Calendarクラスでできます。set()、setTimeInMillis()、getTimeInMillis()あたりのメソッドが使えるでしょう。詳細はリファレンスを参照ください。 > komi1341さんはどういった方法で、計測を行うべきだとお考えでしょうか? 前にも書きましたが、私は通信分野の専門家ではありません。ですので「帯域測定」というのが具体的に何を測定することなのか、正確には理解していません。測定対象が分からないのですから当然、どう計測を行うべきかも分かりません。 でももしデータを一方から他方へ送るだけの片道通信なら、時計を合わせないと速度は計れないでしょう。これは明白ですね。 ですがもしデータの往復時間を計ろうとしているのなら(どうもそのようですが)、例えばWebだとアップロードとダウンロードとで速度が違いますよね。ですのでどういう環境かにもよりますが、単にデータが往復する時間を2で割ったものとか、往復時間そのものを使った計算結果を「帯域速度」みたいに呼べるものなのかな、と。 あーこの人基本が分かってないな、と思うようでしたら無視してもらっていいですよ。そもそものご質問の趣旨から離れていますしね。気になれば自分で勉強します。私の書き方で変に混乱させてしまったようなら申し訳ないです。

debukawa
質問者

お礼

回答ありがとうございます。 komi1341さんのおっしゃったクラスを使ってやってみます。 できなければまた質問させていただきますので、お願いします。

その他の回答 (3)

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

> どうして一致しないのでしょうか? ループを一周するのに2ミリ秒以上かかることがあれば、一致しないこともあるでしょう。 > そもそも、指定した時間と現在の時間が一致したら、作業開始させる > という方法がまずいのでしょうか? 個人的にはその機能自体不要に思われますが…データ送信時刻を送信直前にプログラム内で取得すれば済む話では? 何のための時間指定なのかが分からないので、方法がまずいかまずくないかも判断できません。

debukawa
質問者

お礼

回答ありがとうございます。 試行錯誤した結果、何とか完成しました。 forを書く位置が悪かったようです。 たくさんのアドバイスありがとうございました。

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

> できなければまた質問させていただきますので なるべくご自身で勉強されることをお勧めします。 今回の件もAPIリファレンスを見たり、「java ミリ秒 日時 変換」といったキーワードで検索すればすぐ分かったと思いますよ。

debukawa
質問者

お礼

回答ありがとうございます。 教えていただいた検索のキーワードで検索したら、 よいサイトを見つけました。そこを参考にして作りました。 Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(year, month, date, hourOfDay, minute, second); long TimeMs = calendar.getTimeInMillis(); これで指定した時間をミリ秒に変換することができました。 次は指定した時間になったら送信作業を開始するようにしたいのですが、 その方法が分かりません。 for (;;) {  long Ms = System.currentTimeMillis();  if (TimeMs == Ms)   break; } というようにしてもできません。 私の考えでは、指定した時間のミリ秒と現在の時間のミリ秒が同じに なったときに、ループを抜け、送信作業に進ませたいのですがうまく いきません。 System.out.println(TimeMs); // 指定した時間のミリ秒 System.out.println(Ms); // 現在のミリ秒 これらを使って時間のミリ秒を見てみました。 指定した時間になっても、Msの方の値は、指定した時間のミリ秒(TimeMs) と一致しません。 どうして一致しないのでしょうか? そもそも、指定した時間と現在の時間が一致したら、作業開始させる という方法がまずいのでしょうか? 分かる方、アドバイスお願いします。

debukawa
質問者

補足

もう少し調べてみたらできました。 monthは0から始まるので calendar.set(year, month, date, hourOfDay, minute, second);の部分を calendar.set(year, month-1, date, hourOfDay, minute, second);としたら 指定した時間に動きました。 動いたのですが、計測開始時間までの待ち時間が計測結果時間に影響を及ぼしてしまいます。たぶん、「表示される時間=待ち時間+計測した時間」というようになっています。 これは、komi1341さんがおっしゃっていたサーバ側とクライアント側で時刻設定が行われていないからなのでしょうか?

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

> Ms=System.currentTimeMillis(); > System.out.println(Ms); > で現在の時間の表記の仕方を確認しても、私にはでたらめな数値にしか見えず、 そういうときはまずAPIリファレンスを確認しましょう。 http://java.sun.com./javase/ja/6/docs/ja/api/index.html 左下からSystemクラスを選べば、currentTimeMillis()が返す数字が何なのか、ちゃんと書かれています。 それを「何時何分」みたいな形にしたいのであれば、Dateクラス、SimpleDateFormatクラスについて調べてみてください。ただ通信時間の計測に「何時何分」という表記が必要とはあまり思えませんが。 あと通信についてはあまり詳しくないのですが、サーバ側とクライアント側で時刻設定が異なっていたら気をつける必要がないですか? すでに考慮済みであればいいのですが。

debukawa
質問者

お礼

回答ありがとうございます。 教えていただいたサイトで確認したところ、ミリ秒を返すことと分かりました。 作りたいプログラムのことを説明します。 例えば2009/01/01/01 00:00:00に計測を開始するとしたら、 引数を「IPアドレス ポート番号 バイト量 2009/01/01/01 00:00:00」 というようにしようと考えています。ですから、「何時何分」という表記に変換する必要があると考えていました。 そしてプログラムの中で、2009/01/01/01 00:00:00をミリ秒に変換して、 もし、Ms=System.currentTimeMillis();とその変換した値が同じになった ら計測を開始させたいのです。 ですから、現在は2009/01/01/01 00:00:00をミリ秒に変換する方法を Webサイトで探しています。ですが、時間を表す文字列をミリ秒に変換する 方法がなかなか見つかりません。 >ただ通信時間の計測に「何時何分」という表記が必要とはあまり思えませんが。 ということですが、komi1341さんはどういった方法で、計測を行うべきだとお考えでしょうか? >サーバ側とクライアント側で時刻設定が異なっていたら気をつける必要がないですか? クライアント側で、開始時間になったら、バイトを送信するというように考えています。ですからサーバ側とクライアント側で時刻設定が異なっていても大丈夫だと考えているのですが、この考えはまずいでしょうか?

関連するQ&A

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

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

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

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

    • ベストアンサー
    • Java
  • マイクロ秒を取得するクラス

    java eclipse3.5を使って帯域測定のプログラムを作っています。 現在の時間のミリ秒を次のように取得しています。 long Ms = System.currentTimeMillis() もっと細かく測定したいので、マイクロ秒を取得しようと考えています。 どのクラスを使えばよいでしょうか? 分かる方、アドバイスお願いします。

    • ベストアンサー
    • Java
  • 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
  • javaプログラムの実行時間

    某javaベースのウェブサービスのプログラムをやってます。antでプログラムの実行を行っているので、処理時間を測定したくてSystem.currentTimeMillis()をソースコードに入れても端末には何も表示されませんでした。初心者で申し訳ないが、このようなのをどうすれぼ良いですか。

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

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

    • ベストアンサー
    • Java
  • パケット到達遅延の測定にて

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

    • ベストアンサー
    • Java
  • 帯域計算について

    帯域計算の仕方について教えてください。 100byteのデータをEtherの専用線(IP-VPN)で送信するときですが、 TCPヘッダ(20),IPヘッダ(20),Etherヘッダ(14+4) がくっついて合計158byteの帯域が必要という計算でいいのでしょうか? IP-VPNだからTCPヘッダ(20),IPヘッダ(20)でいいとかにはならないですよね? ちなみに広域Etherでも考え方は変わらないですか?

  • 用語の質問です

    卒業論文でネットワーク帯域測定プログラムを作ることになっています。 UDP通信で次のものを測定する予定です。 ・パケット到達間隔 ・パケット到達遅延 これらの用語を調べたのですが、いまいち理解できません。 この2つがどういったものかを説明していただけないでしょうか?

  • スピードの差

    次のプログラムは userData[0] → userData[1] userData[1] → userData[2] ・・・ ・・・ userData[num-2] → userData[num-1] のように、データを移動するプログラムである。 //■開始時間取得 start = System.currentTimeMillis(); //■移動 for(int i=num-2; i>=0; i--) { userData[i+1] = new UserData(userData[i].name,userData[i].dataPointer); } //■終了時間取得 end = System.currentTimeMillis(); System.out.println("時間:"+(end-start)+"ミリ秒"); numと実行時間はつぎのようになった。 (NetBeans6.0で実行) num 1回目 2回目 3回目 8196 0ms 0ms 0ms 16384 7ms 7ms 7ms 32768 9ms 9ms 8ms 65536 7ms 8ms 14ms 131072 21ms 21ms 24ms 262144 198ms 353ms 212ms 524288 90ms 92ms 91ms このときnum=524288よりnum=262144としたときの方が遅い原因と して何が考えられますか? また、num=1048576としたところ Java Result: 1 となった。実行するにはNetBeansの設定をどのように変えたらよいか?