2012-06-06 18 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" एक यादृच्छिक आईपी शायद मौजूद नहीं मैं लिखा है, यह इस प्रिंट:

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 एमएमएस खर्च करता है, और 43ms खर्च करने के लिए यह अज्ञात है, मेरी समस्या यह है कि URL.openconnection() को "21 9.09.34.23.1" के रूप में क्या किया गया है अज्ञात है? किसी भी मदद के लिए धन्यवाद!

+1

क्या पसंद है? आपका इरादा क्या है? कृपया एक असली प्रश्न – timaschew

+0

में संपादित करें ..... क्या पसंद है? –

उत्तर

6

आप javadocs for URL.openConnection() पढ़ा, तो आप मिल जाएगा:

एक URLConnection उदाहरण है कि दूरदराज के यूआरएल से जाना जाता वस्तु से कनेक्शन का प्रतिनिधित्व करता है देता है।

URLConnection का एक नया उदाहरण हर बार बनाए जाने पर इस URL के लिए प्रोटोकॉल हैंडलर के URLStreamHandler.openConnection (यूआरएल) विधि लागू कर रहा है।

यह ध्यान दिया जाना चाहिए कि URLConnection उदाहरण सृजन पर वास्तविक नेटवर्क कनेक्शन स्थापित नहीं करता है। यह तब होगा जब URLConnection.connect() को कॉल करेगा।

अद्यतन

आईपी आप अपने "यादृच्छिक आईपी" में इस्तेमाल किया मान्य नहीं है; इसमें 4 octets, 5 नहीं होना चाहिए। 43ms शायद इसके लिए है: (1) गैर-आईपी आईपी (2) पर स्टैक ट्रेस प्रिंट करने पर एक DNS लुकअप करना।

+0

मैंने दस्तावेज़ों को देखा है, एक और सवाल यह है कि किस दृश्य में IOException विधि (URL.openconnection) की घोषणा के रूप में फेंक दिया जाएगा क्योंकि वास्तविक नेटवर्क कनेक्शन केवल URLConnection.connect() –

+0

@YunfeiTang को कॉल करते समय स्थापित किया गया है उदाहरण के लिए यूआरएल को हल नहीं किया जा सकता है। – EJP

+0

@EJP क्या यूआरएल के लिए कोई उदाहरण हल नहीं किया जा सकता है? –

4

ओपन कनेक्शन कनेक्ट

openconnection आप यूआरएल सामग्री पक्का है कि डाउनलोड नहीं करता है पसंद नहीं है। आपको कनेक्ट करना होगा। लेकिन वास्तव में नहीं :) निम्नलिखित समझाएंगे:

आपको हमेशा कनेक्शन शुरू करने के लिए कनेक्ट विधि को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है। संचालन जो कनेक्ट होने पर निर्भर करते हैं, जैसे GetInputStream, getOutputStream, आदि, आवश्यक होने पर, कनेक्शन को पूर्ण रूप से निष्पादित करेंगे।

+1

वाह, मैं इस उत्तर के लिए थोड़ी देर खोज रहा हूं। मैं कोई दस्तावेज नहीं ढूंढ पा रहा हूं जो कहता है कि 'कनेक्ट()' को स्पष्ट रूप से बुलाया जा सकता है, लेकिन यह निश्चित रूप से URLConnection के व्यवहार से मेल खाता है। – Benjamin

+0

बेंजामिन, क्या आप अपने वोट को एक वोट पर बदल सकते हैं यदि आपको लगता है कि उत्तर अब सही है? – hasan83

+0

हां, मैंने जवाब दिया है। – Benjamin

संबंधित मुद्दे