2012-06-06 24 views
7

我想知道什么时候做了URL.openconnection()。
我已经做了一些测试这样的:当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 

这意味着它花了5ms运行openconnection,并花了43ms找到它是一个未知的主机,我的问题是,当URL.openconnection()为“219.09.34.23.1”为unknownhost时已经做了什么? 感谢您的帮助!

+1

像什么?你的意图是什么?请编辑一个真正的问题 – timaschew

+0

像什么.....? –

回答

6

如果你读了javadocs for URL.openConnection(),你会发现:

返回表示到URL所引用的 远程对象的连接一个URLConnection实例。

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

应该指出的是,一个URLConnection实例在创建时并不会建立实际的网络连接 。只有当调用URLConnection.connect()时,才会发生这种情况。

更新

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

+0

我已经看到了这个文档,另一个问题是,在哪个场景中,抛出一个IOException作为方法声明(URL.openconnection),因为实际的网络连接只有在调用URLConnection.connect()时才会建立() –

+0

@云飞堂在案例例如,该URL无法解析。 – EJP

+0

@EJP是否有任何URL无法解析的例子? –

4

打开连接并不像连接

OpenConnection的不会让你下载的URL内容这是肯定的。 你必须调用连接。但不是真的:)以下将解释:

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

+1

哇,我一直在寻找这个答案。我一直无法找到任何说明'connect()'可以被隐式调用的文档,但这确实与URLConnection的行为相匹配。 – Benjamin

+0

本杰明,如果你认为现在的答案是正确的,你可以请你把你的投票变成赞成票吗? – hasan83

+0

是的,我已经投了答案。 – Benjamin