スレッドを使って同時にひたすらHTTPリクエストするスクリプト……を Ruby で作ってうまくいかなかったので、泣く泣く Java で作りなおし。
せっかくなので、いままで使ったことがなかった Java 5.0(JDK1.5? Java 2 SDK 5.0? いまいちバージョンがわかりづらいな) で作ってみる。


import java.io.*;
import java.net.*;
import java.util.*;
 
public class Attack {
 
  private static class Accessor extends Thread {
    private static int counter;
    private final URL url;
    private final int number;
    private Accessor(URL url){
      this.number = counter++;
      this.url = url;
    }
    public void run(){
      HttpURLConnection con = null;
      try{
        con = (HttpURLConnection)url.openConnection();
        con.connect();
        System.out.println(
          "[" + number + "]" + con.getResponseCode());
        con.disconnect();
      }catch(IOException e){
        e.printStackTrace();
      }finally{
        if(con != null){
          con.disconnect();
        }
      }
    }
  }
 
  public static void main(String[] args) throws Exception {
 
    String filepath = args[0];
 
    int alltime = -1;
    if(args.length > 1){
      alltime = Integer.parseInt(args[1]);
    }
 
    List urls = new ArrayList();
    {
      BufferedReader in = null;
      try{
        in = new BufferedReader(new FileReader(filepath));
        String url;
        while((url = in.readLine()) != null){
          urls.add(url);
        }
      }catch(IOException e){
        e.printStackTrace();
      }finally{
        if(in != null){
          in.close();
        }
      }
    }
 
    List accessors = new ArrayList();
    for(String url : urls){
      accessors.add(new Accessor(new URL(url)));
    }
 
    long interval = 0;
    if(alltime != -1){
      interval =
        (long)(((double)alltime / urls.size()) * 1000.0);
    }
 
    long begintime = System.currentTimeMillis();
    for(Accessor a : accessors){
      a.start();
      Thread.sleep(interval);
    }
    for(Accessor a : accessors){
      a.join();
    }
    long endtime   = System.currentTimeMillis();
    System.out.println("[Time]" + (endtime - begintime));
  }
 
}

とりあえず、ジェネリックスと foreach な感じのコレクションの反復処理を使ってみた。

参考:


コメント

Generics 使われてる形跡がないんですが(笑
拡張 for 文は、(環境依存かもしれないけれど) size() を取りながら int でまわすより遅いことがあるので注意。

ありゃ? ほんとだ、Generics 使ってないや (^_^;
一度、Generics で書いたあと、拡張 for を使うときに要らなくなって消しちゃったかな。

拡張 for が遅いのは、Iterable だっけそんな Iterator 使ってますよ的なことをしているからとか?

J2SE 5.0 Tiger 虎の穴 拡張 for 文
http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/LangSpec/ExtendedFor/ExtendedFor.html

っぽいね。

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)