2012-06-06 9 views
7

Quiero saber qué se ha hecho cuando URL.openconnection().
que he hecho alguna prueba como esta:¿Qué se ha hecho cuando 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(); 
} 

cuando corro TestConnection ("http://www.google.com"), todas las cosas están bien.
cuando corro TestConnection ("http: //219.09.34.23.1"), "219.09.34.23.1" es una dirección aleatoria tal vez no existe escribí, se imprime la siguiente:

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 

que significa Pasó 5ms para ejecutar openconnection, y gastó 43ms para encontrar que es unhost desconocido, mi problema es, ¿qué se ha hecho cuando URL.openconnection() como "219.09.34.23.1" es unknownhost? ¡Gracias por cualquier ayuda!

+1

como qué? ¿cual es tu intencion? por favor, edite una pregunta real – timaschew

+0

¿Me gusta qué ...? –

Respuesta

6

Si usted lee la javadocs for URL.openConnection(), encontrará:

devuelve una instancia de URLConnection que representa una conexión con el objeto remoto que hace referencia el URL.

una nueva instancia de URLConnection se crea cada vez cuando se invoca el método URLStreamHandler.openConnection (URL) del controlador de protocolo para este URL.

Cabe señalar que una instancia de URLConnection no establece la conexión de red real en la creación. Esto sucederá solo cuando llamando a URLConnection.connect().

actualización

La IP que se utiliza en su "IP al azar" no es válido; debería constar de 4 octetos, no de 5. Los 43ms probablemente sean para: (1) hacer una búsqueda DNS en la IP no IP (2) imprimiendo el seguimiento de la pila.

+0

he visto documentos, otra pregunta es en qué escena se lanzará una IOException como declaración del método (URL.openconnection) ya que una conexión de red real solo se establece al llamar a URLConnection.connect() –

+0

@YunfeiTang En el caso que la URL no se puede resolver, por ejemplo. – EJP

+0

@EJP ¿hay algún ejemplo para que la URL no se pueda resolver? –

4

conexión abierta no es como conectar

OpenConnection no le permite descargar contenidos URL, eso es seguro. tienes que llamar a connect. pero no realmente :) lo siguiente explicará:

No siempre es necesario llamar explícitamente al método de conexión para iniciar la conexión. Las operaciones que dependen de estar conectado, como getInputStream, getOutputStream, etc., realizarán la conexión implícitamente, si es necesario.

+1

Guau, he estado buscando por un tiempo para esta respuesta. No he podido encontrar ninguna documentación que diga que 'connect()' puede llamarse implícitamente, pero eso seguro coincide con el comportamiento de URLConnection. – Benjamin

+0

Benjamin, ¿puede por favor dar vuelta a su voto a favor si considera que la respuesta es correcta? – hasan83

+0

Sí, voté la respuesta. – Benjamin

Cuestiones relacionadas