2012-06-06 9 views
7

Chcę wiedzieć, co zostało zrobione, gdy URL.openconnection().
zrobiłem kilka testów tak:co zostało zrobione, gdy 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(); 
} 

gdy uruchamiam testConnection ("http://www.google.com"), wszystko jest w porządku.
gdy uruchamiam testConnection ("http: //219.09.34.23.1"), "219.09.34.23.1" jest losowa IP może nie istnieć i napisał, że drukowanie to:

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 

to znaczy Wydało 5ms na uruchomienie openconnection i spędził 43ms aby odkryć, że to jest unknownhost, moim problemem jest to, co zostało zrobione, gdy URL.openconnection() jako "219.09.34.23.1" jest unknownhost? Dzięki za pomoc!

+1

co? jaka jest twoja intencja? edytuj do prawdziwego pytania – timaschew

+0

Jakich .....? –

Odpowiedz

6

Jeśli czytasz javadocs for URL.openConnection() znajdziesz:

Zwraca instancję URLConnection który reprezentuje połączenie do zdalnego obiektu określoną przez adres URL.

Nowa instancja połączenia URLConnection jest tworzona za każdym razem podczas wywoływania metody URLStreamHandler.openConnection (URL) procedury protokołu dla tego adresu URL.

Należy zauważyć, że instancja URLConnection nie ustanawia rzeczywistego połączenia sieciowego podczas tworzenia. Stanie się tak tylko wtedy, gdy dzwoni do URLConnection.connect().

Aktualizacja

IP użyte w "ip" losowego nie jest ważny; powinien on składać się z 4 oktetów, a nie 5. 43ms to prawdopodobnie: (1) wykonanie wyszukiwania DNS na nie-IP ip (2) drukowanie śledzenia stosu.

+0

Widziałem te dokumenty, inne pytanie dotyczy tego, w której scenie pojawi się wyjątek IOException jako deklaracja metody (URL.openconnection), ponieważ rzeczywiste połączenie sieciowe jest ustanawiane tylko podczas wywoływania URLConnection.connect() –

+0

@YunfeiTang W przypadku że adresu URL nie można na przykład rozwiązać. – EJP

+0

@EJP czy istnieją przykłady, że adresu URL nie można rozwiązać? –

4

Otwarte połączenie nie jest jak połączyć

OpenConnection nie pozwalają na pobranie zawartości URL, który na pewno. musisz zadzwonić połączyć. ale niezupełnie :) następujące wyjaśnienie:

Nie zawsze wymagane jest jawne wywołanie metody connect w celu zainicjowania połączenia. Operacje zależne od bycia połączonym, takie jak getInputStream, getOutputStream itd., Będą domyślnie wykonywać połączenie, jeśli to konieczne.

+1

Wow, szukałem przez chwilę odpowiedzi. Nie byłem w stanie znaleźć żadnej dokumentacji mówiącej, że 'connect()' może być niejawnie wywoływana, ale to na pewno pasuje do zachowania URLConnection. – Benjamin

+0

Benjamin, proszę, proszę, oddaj swoje głosowanie w dół, aby uzyskać więcej głosów, jeśli uważasz, że teraz odpowiedź jest poprawna? – hasan83

+0

Tak, mam głos oddany w głosowaniu. – Benjamin

Powiązane problemy