Java URL.openconnection()启动时执行了什么操作?

Java URL.openconnection()启动时执行了什么操作?,java,url,httpurlconnection,Java,Url,Httpurlconnection,我想知道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 T

我想知道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,可能不存在我写的,它打印如下:

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
打开:http://219.09.34.23.1
开始时间:1338978920350
openconnection结束时间:133897920355
花费:5毫秒
java.net.UnknownHostException:219.09.34.23.1
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于sun.net.NetworkClient.doConnect(未知源)
位于sun.net.www.http.HttpClient.openServer(未知来源)
位于sun.net.www.http.HttpClient.openServer(未知来源)
在sun.net.www.http.HttpClient。(来源不明)
位于sun.net.www.http.HttpClient.New(未知来源)
位于sun.net.www.http.HttpClient.New(未知来源)
位于sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.connect(未知源)
Main$1.run(Main.java:37)
位于java.lang.Thread.run(未知源)
IOException结束时间:1338978920393
花费:43毫秒
这意味着运行openconnection花费了5毫秒,发现它是一个未知的主机花费了43毫秒,我的问题是,当URL.openconnection()作为“219.09.34.23.1”是未知主机时做了什么? 谢谢你的帮助

如果你读了这篇文章,你会发现:

返回一个
URLConnection
实例,该实例表示到 URL引用的远程对象

每次调用时都会创建
URLConnection
的新实例 协议的
URLStreamHandler.openConnection(URL)
方法 此URL的处理程序

应该注意的是,
URLConnection
实例不会建立 创建时的实际网络连接。只有当 调用
URLConnection.connect()

更新


您在“随机IP”中使用的IP无效;它应该由4个八位字节组成,而不是5个。43ms可能用于:(1)在非IP IP上执行DNS查找(2)打印堆栈跟踪。

开放连接与连接不同

openconnection
不允许您下载确定的URL内容。 您必须调用
connect
。但事实并非如此,以下将解释:


您并不总是需要显式调用
connect
方法来启动连接。依赖于连接的操作,如
getInputStream
getOutputStream
等,将在必要时隐式执行连接。

比如什么?你的意图是什么?请编辑到一个真实的问题我已经看到了文档,另一个问题是,在哪个场景中,IOException将作为方法的声明(URL.openconnection)抛出,因为只有在调用URLConnection.connect()@YunfeiTang时才能建立实际的网络连接,例如,URL无法解析。哇,我一直在寻找这个答案。我找不到任何文档说明可以隐式调用
connect()
,但这确实符合URLConnection的行为。Benjamin,如果您认为现在的答案是正确的,请将您的反对票改为赞成票好吗?