スレッドを使って同時にひたすら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 な感じのコレクションの反復処理を使ってみた。
参考:
- Java 2 Platform Standard Edition 5.0 Development Kit (JDK 5.0)
- 総称 (Generics)
- Generics
- JDK 5.0 ドキュメント - Java プログラミング言語 - 汎用型
- JSR 14: Add Generic Types To The JavaTM Programming Language
- 拡張 for ループ (Enhanced for Loop)
- The For-Each Loop
- JDK 5.0 ドキュメント - Java プログラミング言語 - For-Each ループ
- JSR 201: Extending the JavaTM Programming Language with Enumerations, Autoboxing, Enhanced for loops and Static Import
tags: zlashdot Java Java
Posted by NI-Lab. (@nilab)
コメント
Generics 使われてる形跡がないんですが(笑
拡張 for 文は、(環境依存かもしれないけれど) size() を取りながら int でまわすより遅いことがあるので注意。
投稿者: カリウド | 2005年05月19日 17:48
ありゃ? ほんとだ、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
っぽいね。
投稿者: NI-Lab. | 2005年05月19日 22:55