スピード測定(画像も含めたもの)

戻る

::::::::::::::
AbsolutePathObtainer.java
::::::::::::::
import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.net.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
* @author KISHI Yasuhiro
* 絶対URLに変換する
*/

public class AbsolutePathObtainer {

    /** 相対パスから絶対パスに変更する
    * @param currentUrl 処理しているURL	
    * @param path リンク先のパス
    * @return 絶対パス
    */
    static public String getAbsolutePath( URL currentUrl, String path ) {
        if ( path.toLowerCase().startsWith( "http:" )
                || path.toLowerCase().startsWith( "https:" )
                || path.toLowerCase().startsWith( "ftp:" )
                || path.toLowerCase().startsWith( "mailto:" )
           ) {
            /* do nothing */
        } else if ( path.startsWith( "/" ) ) {
            /* / でスタートするのは、ホスト内の絶対パス表記であるので、プロトコルとホスト名を頭に付ける */
            path = currentUrl.getProtocol() + "://" + currentUrl.getHost() + path;
        } else if ( path.startsWith( "./" ) ) {
            // 先頭の "./" を削除する
            path = path.replaceAll( "^./", "" );
            path = getDirName( currentUrl ) + path;
        } else if ( path.startsWith( "../" ) ) {
            path = getParentPath( currentUrl, path );
        } else {
            path = getDirName( currentUrl ) + path;

        }

        return path;
    }

    /** URLからディレクトリ名を得る
    * @param url URL
    * @return ディレクトリ名	
    */
    static private String getDirName( URL url ) {

        String dirName = null;

        Pattern p;
        Matcher m;

        p = Pattern.compile( "^(.+/).*$" );
        m = p.matcher( url.toString() );
        if ( m.find() ) {
            dirName = m.group( 1 );
        }

        // System.err.println( " *** DEBUG *** in getDirName :");
        // System.err.println( "\t" + "urlString = " + urlString + " dirName = " + dirName
        // 			+ " プロトコル = " + url.getProtocol() );

        if ( dirName.equals( url.getProtocol() + "://" ) ) {
            dirName = url.toString() + "/";
        }

        return dirName;
    }

    /** 上位の相対パスを処理する
    @param url 処理しているURL
    @param relativePath ../などが先頭に付いたパス
    @return ../などを削除して書き直したもの
    */
    static private String getParentPath( URL url, String relativePath ) {

        Pattern p;
        Matcher m;

        String parentPath = null;
        String tempPath = url.getProtocol() + "://" + url.getHost() + url.getPath();

        int count = 0;
        while ( relativePath.startsWith( "../" ) ) {

            //==========================================================================
            // 末尾のディレクトリ名あるいはディレクトリ名+"/"+ファイル名を削除
            //==========================================================================
            p = Pattern.compile( "(.+/).+/.*$" );
            m = p.matcher( tempPath );
            if ( m.find() ) {
                tempPath = m.group( 1 );
            }

            //==========================================================================
            // 相対パスの先頭の"../"を削除する
            //==========================================================================
            p = Pattern.compile( "^\\.\\./(.*)$" );
            m = p.matcher( relativePath );
            if ( m.find() ) {
                relativePath = m.group( 1 );
            }

        }

        return tempPath + relativePath;
    }

    /**
    * テストコード
    */
    public static void main( String[] args ) throws Exception {
        URL baseURL = new URL( "http://www.abc.co.jp/xxx/yyy/" );

        System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "../../test.jpg" ) );
        System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "../test.jpg" ) );
        System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "./test.jpg" ) );
        System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "test.jpg" ) );
        System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "/test.jpg" ) );
        System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "http://www.abc.co.jp/OPQ/test.jpg" ) );
    }
}
::::::::::::::
ContentObtainer.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/

public class ContentObtainer {

    public String getResponseBodyAsString( String urlString, String encoding ) throws Exception {

        StringBuilder sb = new StringBuilder();

        URL url;
        try {
            url = new URL( urlString );

            HttpURLConnection connection = ( HttpURLConnection ) url.openConnection();

            //---------------------------------------------------------------
            // ユーザ・エージェントの設定
            //---------------------------------------------------------------
            String userAgent = RagUtil.sha1Digest( new Date().toString() + "128-256-384-512-640-768" );
            if ( ( url.hashCode() + userAgent.hashCode() ) % 2 == 0 ) {
                userAgent = userAgent.toUpperCase();
            }

            connection.setRequestProperty( "User-Agent", userAgent );
            // System.err.println( "User-Agent: " + userAgent );

            //---------------------------------------------------------------
            // HTTP応答コードの取得
            //---------------------------------------------------------------
            int responseCode = connection.getResponseCode();
            System.out.println( urlString + ": 応答コード=" + responseCode + "\n" );

            BufferedReader reader = new BufferedReader( new InputStreamReader(
                                        connection.getInputStream(), encoding ) );

            String line;
            while ( ( line = reader.readLine() ) != null ) {
                sb.append( line + "\n" );
            }
            reader.close();

        } catch ( Exception e ) {
            throw e;
        }

        return sb.toString();

    }

}

::::::::::::::
DownloaderRunnable.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/

public class DownloaderRunnable implements Runnable {
    private String target;
    private long size;

    public DownloaderRunnable( String target ) {
        this.target = target;
    }
    public void run() {
        ImageDownloader downloader = new ImageDownloader( target );
        size = downloader.download();
    }

    public long getSize() {
        return size;
    }

}
::::::::::::::
ImageDownloadManager.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/

public class ImageDownloadManager {

    public static void download( java.util.Set urlSet ) {

        Iterator iterator = urlSet.iterator();
        while ( iterator.hasNext() ) {
            String target = ( String ) iterator.next();
            System.out.println( target );

            DownloaderRunnable runnable = new DownloaderRunnable( target );

            Thread thread = new Thread( runnable );
            thread.start();
            try {
                thread.join();

            } catch ( Exception e ) {
                e.printStackTrace();
            }

        }

        System.out.println( "完了しました!" );
    }
}
::::::::::::::
ImageDownloader.java
::::::::::::::
import java.io.*;
import java.net.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/
public class ImageDownloader {
    private String urlString;
    private BufferedOutputStream bos;
    private OutputStream out = null ;
    private long iSize = 0;

    public ImageDownloader( String urlString, OutputStream out ) {
        this.urlString = urlString;
        this.out = out;
    }

    /**
    * 空読みする場合
    */
    public ImageDownloader( String urlString ) {
        this.urlString = urlString;
    }

    public long download() {
        try {

            //-------------------------------------------------
            // URL の作成
            //-------------------------------------------------
            URL url = new URL( urlString );

            // コネクトして、HttpURLConnection の作成
            HttpURLConnection connection = ( HttpURLConnection ) url.openConnection();
            connection.setRequestMethod( "GET" );

            //---------------------------------------------------------------
            // HTTP応答コードの取得
            //---------------------------------------------------------------
            int responseCode = connection.getResponseCode();
            System.out.println( "\t応答コード=" + responseCode );

            if ( out != null ) {
                // 出力ストリーム
                bos = new BufferedOutputStream( out );
            }

            // 入力ストリーム
            BufferedInputStream bis = new BufferedInputStream( connection.getInputStream() );
            int size = bis.available();

            byte[] buf = new byte[ size ];

            int len = 0;
            while ( ( len = bis.read( buf ) ) > 0 ) {
                if ( out != null ) {
                    bos.write( buf, 0, len );
                }

                // 読み込んだサイズを加算
                iSize += len;
            }

            bis.close();

            if ( out != null ) {
                bos.close();
            }

            System.out.println( "\t画像ファイルサイズ=" + iSize + "\n" );

        } catch ( Exception e ) {
            e.printStackTrace();
        }

        return iSize;
    }

    static public void main( String[] args ) {

        if ( args.length != 1 ) {
            System.err.println( "Usage: java -cp . ImageDownloader [URL]" );
            System.exit( 1 );
        }

        String targetUrl = args[ 0 ];

        ImageDownloader downloader = new ImageDownloader( targetUrl, System.out );
        downloader.download();

    }

}
::::::::::::::
ImageURLObtainer.java
::::::::::::::
import java.util.*;
import java.util.regex.*;
import java.io.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
* @author KISHI Yasuhiro
* 正規表現を使って、画像URLを抽出する
*/

public class ImageURLObtainer {

    /**
    * @param in 処理対象文字列
    * @return 取り出した結果のリスト
    */
    public static List obtain( String in ) {

        List result = new LinkedList();

        // 先頭がIMGでそれ以降に初めて出現したSRC属性の値を求める
        // ただしシングルクォートあるいはダブルクォートで挟み込まれてなくてはいけない
        Pattern p = Pattern.compile( "<IMG.*?\\s+?SRC=(\"|\')(.*?)(\"|\')(.*?>)",
                                     Pattern.CASE_INSENSITIVE | Pattern.DOTALL );

        Matcher m = p.matcher( in );
        while ( m.find() ) {
            result.add( m.group( 2 ) );
        }

        return result;
    }

    /**
    * テストコード
    */
    public static void main( String[] args ) {
        String str = "...............<img src=\"AAA.jpg\">.................";
        str += "<img    src=\"test.gif\" alt=\"aaa\">";
        str += "<img    width='1000' src=\"test2.gif\" alt=\"aaa\">\n";
        str += "<img width='333' src='/test3.ping' alt=\"aaa\">\n";
        str += "<img width='999' src='/test3.ping' alt=\"aaa\">\n";

        List result = ImageURLObtainer.obtain( str );

        Iterator iterator = result.iterator();
        while ( iterator.hasNext() ) {
            System.out.println( iterator.next() );
        }
    }
}

::::::::::::::
RagUtil.java
::::::::::::::
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.regex.*;
import java.security.MessageDigest;

public class RagUtil {
    /** 文字列からSHA1ハッシュ値を求めて16進で表示する
    @param str 入力文字列
    @return ハッシュ値
    */
    static public String sha1Digest( String str ) {
        StringBuffer result = new StringBuffer( "" );
        try {
            MessageDigest md = MessageDigest.getInstance( "SHA1" ); /* MD5のときは"MD5"とすればいいですよ! */
            md.update( str.getBytes() );
            byte[] digest = md.digest();

            for ( int i = 0; i < digest.length; i++ ) {
                if ( ( digest[ i ] & 0x0ff ) / 16 == 0 ) {
                    result.append( "0" );
                }
                result.append( Integer.toHexString( digest[ i ] & 0x0ff ) );
            }

        } catch ( Exception e ) {}

        return result.toString();
    }

}

::::::::::::::
WebClientEmulator.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;

/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/

public class WebClientEmulator {

    public static void main( String[] args ) {

        if ( args.length != 2 ) {
            System.out.println( "Usage: java -cp . WebClientEmulator [url] [encoding]" );
            System.exit( 1 );
        }
        String urlAsString = args[ 0 ];
        String encoding = args[ 1 ];

        /******************************************************************************/
        /* 接続タイムアウトの設定; 設定された時間でコネクトできない場合はタイムアウト */
        /******************************************************************************/
        System.setProperty ( "sun.net.client.defaultConnectTimeout", "10000" );

        /**********************************************************************************/
        /* 読み取りタイムアウトの設定; 設定された時間で読み取りできない場合はタイムアウト */
        /**********************************************************************************/
        System.setProperty ( "sun.net.client.defaultReadTimeout", "10000" );

        Iterator iterator;
        long elapsedTime, start, end;
        start = System.currentTimeMillis();
        long totalImageSize = 0;

        try {
            //-------------------------------------------------------
            // 対象URLのレスポンスボディを取得
            //-------------------------------------------------------
            ContentObtainer obtainer = new ContentObtainer();
            String resBody = obtainer.getResponseBodyAsString( urlAsString, encoding );

            //-------------------------------------------------------
            // IMGタグ内に含まれるURLを取り出す
            //-------------------------------------------------------
            List result = ImageURLObtainer.obtain( resBody );

            iterator = result.iterator();
            java.util.Set urlSet = new java.util.TreeSet();
            while ( iterator.hasNext() ) {
                String target = ( String ) iterator.next();

                //-------------------------------------------------------
                // 絶対パスに変換
                //-------------------------------------------------------
                String absPath = AbsolutePathObtainer.getAbsolutePath( new URL( urlAsString ), target );

                //-------------------------------------------------------
                // Setに格納して重複を取り除く
                //-------------------------------------------------------
                urlSet.add( absPath );

            }

            //-------------------------------------------------------
            // IMGのURLだけコンテンツダウンロードする(複数スレッドで同時実行)
            //-------------------------------------------------------
            ImageDownloadManager.download( urlSet );

        } catch ( Exception e ) {
            e.printStackTrace();
        }

        end = System.currentTimeMillis();
        elapsedTime = ( end - start ) ;

        System.out.println( "\n経過時間: " + elapsedTime + " msec" );
    }
}

■以下実行結果

$ java -cp . WebClientEmulator http://www.doblog.com/weblog/myblog/7160 UTF8
http://www.doblog.com/weblog/myblog/7160: 応答コード=200

http://www.doblog.com/img/u7160/bgthumb/BTH2527081_0B.jpg
        応答コード=200
        画像ファイルサイズ=9562

http://www.doblog.com/img/u7160/bgthumb/BTH2527113_0B.jpg
        応答コード=200
        画像ファイルサイズ=7544

http://www.doblog.com/img/u7160/bgthumb/BTH2527113_1B.jpg
        応答コード=200
        画像ファイルサイズ=11523

http://www.doblog.com/img/u7160/bgthumb/BTH2527113_2B.jpg
        応答コード=200
        画像ファイルサイズ=14088

http://www.doblog.com/img/u7160/bgthumb/BTH2527113_3B.jpg
        応答コード=200
        画像ファイルサイズ=10850

http://www.doblog.com/img/u7160/bgthumb/BTH2527117_0B.jpg
        応答コード=200
        画像ファイルサイズ=5498

http://www.doblog.com/img/u7160/bgthumb/BTH2527117_1B.jpg
        応答コード=200
        画像ファイルサイズ=6307

http://www.doblog.com/img/u7160/bgthumb/BTH2527117_2B.jpg
        応答コード=200
        画像ファイルサイズ=6614

http://www.doblog.com/img/u7160/bgthumb/BTH2527126_0B.jpg
        応答コード=200
        画像ファイルサイズ=11081

http://www.doblog.com/img/u7160/bgthumb/BTH2527126_1B.jpg
        応答コード=200
        画像ファイルサイズ=12582

http://www.doblog.com/img/u7160/bgthumb/BTH2527126_2B.jpg
        応答コード=200
        画像ファイルサイズ=12321

http://www.doblog.com/img/u7160/bgthumb/BTH2527126_3B.jpg
        応答コード=200
        画像ファイルサイズ=7894

http://www.doblog.com/img/u7160/bgthumb/BTH2527126_4B.jpg
        応答コード=200
        画像ファイルサイズ=12462

http://www.doblog.com/img/u7160/bgthumb/BTH2527132_0B.jpg
        応答コード=200
        画像ファイルサイズ=8180

http://www.doblog.com/img/u7160/bgthumb/BTH2527132_1B.jpg
        応答コード=200
        画像ファイルサイズ=7627

http://www.doblog.com/img/u7160/bgthumb/BTH2527885_0B.jpg
        応答コード=200
        画像ファイルサイズ=7573

http://www.doblog.com/img/u7160/bgthumb/BTH2527912_0B.jpg
        応答コード=200
        画像ファイルサイズ=6114

http://www.doblog.com/img/u7160/bgthumb/BTH2527912_1B.jpg
        応答コード=200
        画像ファイルサイズ=6583

http://www.doblog.com/img/u7160/bgthumb/BTH2527912_2B.jpg
        応答コード=200
        画像ファイルサイズ=5516

http://www.doblog.com/img/u7160/bgthumb/BTH2527912_3B.jpg
        応答コード=200
        画像ファイルサイズ=6188

http://www.doblog.com/img/u7160/bgthumb/BTH2527912_4B.jpg
        応答コード=200
        画像ファイルサイズ=4906

http://www.doblog.com/img/u7160/bgthumb/BTH2527994_0B.jpg
        応答コード=200
        画像ファイルサイズ=12224

http://www.doblog.com/img/u7160/bgthumb/BTH2527994_1B.jpg
        応答コード=200
        画像ファイルサイズ=4438

http://www.doblog.com/img/u7160/bgthumb/BTH2528075_0B.jpg
        応答コード=200
        画像ファイルサイズ=4558

http://www.doblog.com/img/u7160/bgthumb/BTH2528075_1B.jpg
        応答コード=200
        画像ファイルサイズ=6766

http://www.doblog.com/img/u7160/bgthumb/BTH2528425_0B.jpg
        応答コード=200
        画像ファイルサイズ=8039

完了しました!

経過時間: 3312 msec


戻る

inserted by FC2 system