2012-06-06 19 views
7

Tôi muốn biết những gì đã được thực hiện khi URL.openconnection().
tôi đã làm một số xét nghiệm như thế này:điều gì đã được thực hiện khi 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(); 
} 

khi tôi chạy testConnection ("http://www.google.com"), tất cả mọi thứ là ok.
khi tôi chạy testConnection ("http: //219.09.34.23.1"), "219.09.34.23.1" là một ip ngẫu nhiên có lẽ không tồn tại i đã viết, nó in này:

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 

nó có nghĩa là nó đã dành 5ms để chạy openconnection, và đã dành 43ms để tìm thấy nó là một unknownhost, vấn đề của tôi là, những gì đã được thực hiện khi URL.openconnection() là "219.09.34.23.1" là unknownhost? Cảm ơn bạn đã giúp đỡ!

+1

như thế nào? Ý định của bạn là gì? xin vui lòng chỉnh sửa cho một câu hỏi thực sự – timaschew

+0

Giống như những gì .....? –

Trả lời

6

Nếu bạn đọc javadocs for URL.openConnection(), bạn sẽ tìm thấy:

Trả về một ví dụ URLConnection đại diện cho một kết nối đến đối tượng từ xa gọi bằng URL.

Một phiên bản URLConnection mới được tạo mỗi lần khi gọi phương thức URL1StreamHandler.openConnection (URL) của giao thức cho URL này.

Cần lưu ý rằng một cá thể URLConnection không thiết lập kết nối mạng thực tế khi tạo. Điều này sẽ chỉ xảy ra khi gọi URLConnection.connect().

Cập nhật

Các chỉ IP mà bạn sử dụng trong "ip ngẫu nhiên" của bạn không hợp lệ; nó nên bao gồm 4 octet, không 5. 43ms có lẽ là: (1) thực hiện tra cứu DNS trên ip không IP (2) in dấu vết ngăn xếp.

+0

Tôi đã thấy tài liệu đó, một câu hỏi khác là trong đó cảnh IOException sẽ được ném như khai báo phương thức (URL.openconnection) vì kết nối mạng thực tế chỉ được thiết lập khi gọi URLConnection.connect() –

+0

@YunfeiTang Trong trường hợp ví dụ: URL không thể được giải quyết. – EJP

+0

@EJP có bất kỳ ví dụ nào cho URL không thể giải quyết được không? –

4

mở kết nối không giống như kết nối

openconnection không cho phép bạn tải về nội dung url đó là chắc chắn. bạn phải gọi kết nối. nhưng không thực sự :) sau đây sẽ giải thích:

Bạn không phải lúc nào cũng được yêu cầu gọi phương thức kết nối để bắt đầu kết nối một cách rõ ràng. Các hoạt động phụ thuộc vào việc được kết nối, như getInputStream, getOutputStream, vv, sẽ ngầm thực hiện kết nối, nếu cần thiết.

+1

Chà, tôi đã tìm kiếm một lúc cho câu trả lời này. Tôi đã không thể tìm thấy bất kỳ tài liệu nào nói rằng 'connect()' có thể được ngầm gọi, nhưng chắc chắn nó phù hợp với hành vi của URLConnection. – Benjamin

+0

Benjamin, bạn có thể vui lòng bỏ phiếu bầu của bạn xuống một phiếu bầu nếu bạn nghĩ rằng câu trả lời ngay bây giờ là chính xác? – hasan83

+0

Có, tôi đã bỏ phiếu cho Câu trả lời. – Benjamin

Các vấn đề liên quan