9

URL.openconnection()で何が行われたのか知りたい。
私はこのようないくつかのテストを行いました:

public static void main(String[] args) {
    //    testConnection("http://www.google.com");
    testConnection("http://219.09.34.23.1");
}

private static void testConnection(final String _url) {
    new Thread(new Runnable() {
        String strurl = _url;
        long starttime = 0;
        long endtime = 0;

        public void run() {
            try {
                System.out.println("open:" + strurl);

                starttime = System.currentTimeMillis();
                System.out.println("starttime:" + starttime);

                URL url = new URL(strurl);
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();

                endtime = System.currentTimeMillis();
                System.out.println("openConnection endtime:" + endtime);
                System.out
                        .println("spend:" + (endtime - starttime) + " ms");

                conn.connect();
                endtime = System.currentTimeMillis();
                System.out.println("connect endtime2:" + endtime);
                System.out
                        .println("spend:" + (endtime - starttime) + " ms");

                conn.getResponseCode();
                endtime = System.currentTimeMillis();
                System.out.println("endtime3:" + endtime);
                System.out
                        .println("spend:" + (endtime - starttime) + " ms");
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                endtime = System.currentTimeMillis();
                System.out.println("MalformedURLException endtime:"
                        + endtime);
                System.out
                        .println("spend:" + (endtime - starttime) + " ms");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                endtime = System.currentTimeMillis();
                System.out.println(" IOException endtime:" + endtime);
                System.out
                        .println("spend:" + (endtime - starttime) + " ms");
            }

        }
    }).start();
}

testConnection( "http://www.google.com")を実行すると、すべて問題ありません。
testConnection( "http://219.09.34.23.1")を実行すると、 "219.09.34.23.1"はランダムなIPであり、私が書いたIPは存在しない可能性があり、次のように出力されます。

open:http://219.09.34.23.1
starttime:1338978920350
openconnection endtime:1338978920355
spend:5 ms

    java.net.UnknownHostException: 219.09.34.23.1  
    at java.net.PlainSocketImpl.connect(Unknown Source)  
    at java.net.SocksSocketImpl.connect(Unknown Source)  
    at java.net.Socket.connect(Unknown Source)  
    at java.net.Socket.connect(Unknown Source)  
    at sun.net.NetworkClient.doConnect(Unknown Source)  
    at sun.net.www.http.HttpClient.openServer(Unknown Source)  
    at sun.net.www.http.HttpClient.openServer(Unknown Source)  
    at sun.net.www.http.HttpClient.<init>(Unknown Source)  
    at sun.net.www.http.HttpClient.New(Unknown Source)  
    at sun.net.www.http.HttpClient.New(Unknown Source)  
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)  
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)  
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)  
    at Main$1.run(Main.java:37)  
    at java.lang.Thread.run(Unknown Source)

IOException endtime:1338978920393
spend:43 ms

これは、openconnectionの実行に5ミリ秒を費やし、それが不明なホストであることを見つけるのに43ミリ秒を費やしたことを意味します。私の問題は、「219.09.34.23.1」としてのURL.openconnection()が不明なホストである場合に何が行われたかです。助けてくれてありがとう!

4

2 に答える 2

10

のjavadocsURL.openConnection()を読むと、次のことがわかります。

URLConnectionURLによって参照されるリモートオブジェクトへの接続を表すインスタンスを返します。

このURLのプロトコルハンドラURLConnectionのメソッドを呼び出すたびに、の新しいインスタンスが作成されます。URLStreamHandler.openConnection(URL)

URLConnectionインスタンスは、作成時に実際のネットワーク接続を確立しないことに注意してください。これは、を呼び出すときにのみ発生しURLConnection.connect()ます。

アップデート

「ランダムIP」で使用したIPは無効です。5ではなく4オクテットで構成する必要があります。43msはおそらく次の目的で使用されます。(1)非IP IPでDNSルックアップを実行する(2)スタックトレースを出力する。

于 2012-06-06T14:27:15.453 に答える
9

オープン接続は接続とは異なります

openconnection確かなURLコンテンツをダウンロードすることはできません。に電話する必要がありますconnect。しかし、実際にはそうではありませんが、以下で説明します。

connect接続を開始するためにメソッドを明示的に呼び出す必要は必ずしもありません。getInputStream、などの接続に依存する操作はgetOutputStream、必要に応じて暗黙的に接続を実行します。

于 2013-06-21T18:22:54.660 に答える