Shammer's Philosophy

My private adversaria

同一ソケットから HTTP リクエストを繰り返し実行するクライアント Ver 1.0

HTTP で何か動作確認するときには、Cookie を追加したくなったりもするので、同一ソケットから HTTP リクエストを繰り返し実行するクライアント(修正版) - Shammerismにさらに手を加えて Cookie も送付できるように変更。また、Sleep する時間も調整できるようにした。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class RepeatClient {
    public static void main(String[]args)throws Exception{
	if( args.length != 5 ){
	    System.out.println("Usage: java RepeatClient $HOST $PORT $URI $REPEAT_COUNT $SLEEP_TIME\n");
	    System.exit(1);
	}
	Socket socket = null;
	BufferedReader stdinr = new BufferedReader(new InputStreamReader(System.in));
	BufferedReader reader = null;
	BufferedWriter writer = null;
	try {
	    System.out.print("Type Cookie Value:");
	    String cookie = stdinr.readLine();
	    socket = new Socket(args[0], Integer.parseInt(args[1]));
	    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
	    int repeatCount = Integer.parseInt(args[3]);
	    int sleepTime   = Integer.parseInt(args[4]);
	    boolean receivedConnectionClosedHeader = false;
	    for( int i = 0 ; i < repeatCount && !receivedConnectionClosedHeader ; i++ ) {
		if( i != 0 ){
		    try {
			Thread.sleep(sleepTime * 1000);
		    }
		    catch(InterruptedException ignore){}
		}
		System.out.println("==============================");
		System.out.println((i + 1) + " times try start!");
		System.out.println("==============================");
		int responseBodyContentLength = 0;
		writer.write("GET " + args[2] + " HTTP/1.1\r\n");
		writer.write("Host: " + args[0] + "\r\n");
		writer.write("Connection: Keep-Alive\r\n");
		if( !"".equals(cookie) ){
		    writer.write("Cookie: " + cookie + "\r\n");
		}
		writer.write("\r\n");
		writer.flush();

		while(true){
		    String line = reader.readLine();
		    if( line.equals("") ){
			System.out.println("");
			break;
		    }
		    else if( line.startsWith("Content-Length:") ){
			String[] array = line.split(": ");
			responseBodyContentLength = Integer.parseInt(array[1]);
		    }
		    else if( line.equalsIgnoreCase("Connection: close") ){
			// Received "Connection: close" HTTP Response header,
			// exit for loop whose count value is i.
			receivedConnectionClosedHeader = true;
		    }
		    else {
			System.out.println(line);
		    }
		}
		// Read Response Body(supported only ascii)
		for( int j = 0 ; j < responseBodyContentLength ; j++ ){
		    System.out.print((char)reader.read());
		}
		System.out.println("==============================");
		System.out.println((i + 1) + " times try finish!");
		System.out.println("==============================");
	    }
	}
	catch(Exception e){
	    e.printStackTrace();
	}
	finally{
	    if( writer != null ){
		try {
		    writer.close();
		}
		catch(Exception ignore){}
	    }
	    if( reader != null ){
		try {
		    reader.close();
		}
		catch(Exception ignore){}
	    }
	    if( socket != null ){
		try {
		    socket.close();
		}
		catch(Exception ignore){}
	    }
	}
    }
}