« 顧客とリスクについて話すのは難しい | トップページ | 「更新系」はどこへ? »

2009年2月14日 (土)

回線速度の計測

Java で簡単なプログラムを書いて、 LAN 回線速度の計測をしてみました。

最初に、サーバを立ち上げます。

>java -server SpeedTest server 9999

ローカル・ループバック・アドレスにデータを送ってみます。

>java -client SpeedTest client localhost 9999
30
131
420
851
4236
8493
42591
1.7476266666666668E7
6.403517557251909E7
9.986438095238096E7
9.857353701527615E7
9.901567516525024E7
9.87708465795361E7
9.847864572327487E7
8.231636109641485E7

一番最後の数字が、平均の bps 値です。おおよそ 100M bps に近い数字が出てます。

Windows クライアントから、 Linux サーバ (Vine 4.2) にデータを送ります。

>java -client SpeedTest client 192.168.0.125 9999
689
7018
33605
70920
344607
715351
3516913
760940.4934687953
1195298.945568538
1248119.029906264
1182826.8471517202
1217126.7559858041
1172656.2205127273
1192609.5413790445
1138511.1191389847

1Mbps くらいしか出てませんね。カーネル・パラメータのせいかな。後で調べる。

ソースコードは以下のとおりです。

import java.net.*;
import java.io.*;

public class SpeedTest {

  public static void main(String[] args) {
    if (args.length == 2 && args[0].toLowerCase().charAt(0) == 's') {
      try {
        startServer(Integer.parseInt(args[1]));
      } catch (IOException e) {
        e.printStackTrace();
      }
    } else if (args.length == 3 && args[0].toLowerCase().charAt(0) == 'c') {
      try {
        startClient(args[1], Integer.parseInt(args[2]));
      } catch (IOException e) {
        e.printStackTrace();
      }
    } else {
      System.out.println("usage: server port | client host port");
    }
  }

  public static void startServer(int port) throws IOException {
    final int STATUS_RCV = 0;
    final int STATUS_CMD = 1;
    final int STATUS_RST = 2;

    ServerSocket server = new ServerSocket(port);
    for (;;) {
      Socket sock = server.accept();
      System.out.println("accept: " +
        sock.getInetAddress().getHostAddress());

      BufferedInputStream in =
        new BufferedInputStream(sock.getInputStream());
      PrintWriter out =
        new PrintWriter(sock.getOutputStream(), true);

      int stat = STATUS_RCV;
      long startMs = System.currentTimeMillis();
      int ch;

      while ((ch = in.read()) != -1) {
        if (stat == STATUS_RST) {
          startMs = System.currentTimeMillis();
          stat = STATUS_RCV;
        }
        if (stat == STATUS_RCV && ch == '\\') {
          stat = STATUS_CMD;
        } else if (stat == STATUS_CMD) {
          if (ch == 's') {
            long ms = System.currentTimeMillis() - startMs;
            out.println(ms);
            System.out.println(ms);
            stat = STATUS_RST;
          } else if (ch == 'q') {
            break;
          } else {
            stat = STATUS_RCV;
          }
        }
      }
      out.close();
      in.close();

      System.out.println("quit: " + sock.getInetAddress().getHostAddress());
      sock.close();
    }
  }

  public static void startClient(String host, int port) throws IOException {
    final int[] sendSizes =
      {65536,     // 64KB
       1048576,   // 1MB
       5242880,   // 5MB
       10485760,  // 10MB
       52428800,  // 50MB
       104857600, // 100MB
       524288000  // 500MB
      };
    int[] recvMs = new int[sendSizes.length];

    Socket sock = new Socket(host, port);
    BufferedOutputStream out =
      new BufferedOutputStream(sock.getOutputStream());
    BufferedReader in = new BufferedReader(
      new InputStreamReader(sock.getInputStream()));

    for (int i = 0; i < sendSizes.length; i ++) {
      for (int j = 0; j < sendSizes[i] - 2; j++) {
        out.write('X');
      }
      out.write('\\');
      out.write('s');
      out.flush();
      recvMs[i] = Integer.parseInt(in.readLine());
      System.out.println(recvMs[i]);
    }
    out.write('\\');
    out.write('q');
    out.flush();
    in.close();
    out.close();

    double sendBpsSum = 0.0d;
    int sendBpsCount = 0;
    for (int i = 0; i < sendSizes.length; i++) {
      if (recvMs[i] > 0) {
        double sendBps = sendSizes[i] * 8000.0d / recvMs[i];
        System.out.println(sendBps);
        sendBpsSum += sendBps;
        sendBpsCount++;
      }
    }
    System.out.println(sendBpsSum / sendBpsCount);
  }

}

|

« 顧客とリスクについて話すのは難しい | トップページ | 「更新系」はどこへ? »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/28081786

この記事へのトラックバック一覧です: 回線速度の計測:

« 顧客とリスクについて話すのは難しい | トップページ | 「更新系」はどこへ? »