Вопрос по java, url, httpurlconnection – что было сделано, когда URL.openconnection ()?

8

Я хочу знать, что было сделано, когда 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 (& quot; http: //www.google.com"), все в порядке.
когда я запускаю testConnection (& quot; http: //219.09.34.23.1"), & quot; 219.09.34.23.1 & quot; это случайный 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

это означает, что он потратил 5 мсек на запуск openconnection и потратил 43 мсек, чтобы обнаружить, что это неизвестный хост, моя проблема в том, что было сделано, когда URL.openconnection () как & quot; 219.09.34.23.1 & quot; неизвестный хост? Спасибо за любую помощь!

Как что.....? Michael-O
как что? каково ваше намерение? пожалуйста, измените на реальный вопрос timaschew

Ваш Ответ

2   ответа
5

Open connection is not like connect

openconnection не позволяет вам загружать контент URL, который наверняка. Вы должны позвонить, подключиться. но не совсем :) следующее объяснит:

От вас не всегда требуется явно вызывать метод connect, чтобы инициировать соединение. Операции, которые зависят от соединения, такие как getInputStream, getOutputStream и т. Д., При необходимости будут неявно выполнять соединение.

Бенджамин, можешь ли ты превратить свой голос "против" в голос "против", если ты считаешь, что ответ сейчас правильный?
Вау, я долго искал этот ответ. Мне не удалось найти какую-либо документацию, в которой говорится, чтоconnect() может вызываться неявно, но это точно соответствует поведению URLConnection.
Да, я проголосовал за ответ.
6

Javadocs для URL.openConnection ()вы найдете:

Returns a URLConnection instance that represents a connection to the remote object referred to by the URL.

A new instance of URLConnection is created every time when invoking the URLStreamHandler.openConnection(URL) method of the protocol handler for this URL.

It should be noted that a URLConnection instance does not establish the actual network connection on creation. This will happen only when calling URLConnection.connect().

Update

IP-адрес, который вы использовали в своем & quot; случайном ip & quot; не является действительным; он должен состоять из 4 октетов, а не 5. Вероятно, 43 мсек используются для: (1) поиска DNS в IP-адресах, отличных от IP (2), печати трассировки стека.

@EJP, есть ли примеры для URL, которые не могут быть разрешены? Yunfei Tang
я видел, что документы, другой вопрос заключается в том, в какой сцене IOException будет брошено как объявление метода (URL.openconnection), так как фактическое сетевое соединение устанавливается только при вызове URLConnection.connect () Yunfei Tang
@YunfeiTang В случае, если URL-адрес не может быть разрешен, например.

Похожие вопросы