2014-02-28 89 views
0

我發現從互聯網下面的2段代碼,我在我的應用程序中使用它。HttpURLConnection握手和請求發送

我真的不明白的一件事是,爲什麼沒有HttpUrlConnection.connect()被調用來建立Http連接(握手),並且沒有任何函數被調用來將請求發送到服務器?誰能解釋一下?代碼如何跳過,但仍然可以獲得響應?

// HTTP GET request 
    private void sendGet() throws Exception { 

     String url = "http://www.google.com/search?q=mkyong"; 

    URL obj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 

    // optional default is GET 
    con.setRequestMethod("GET"); 

    //add request header 
    con.setRequestProperty("User-Agent", USER_AGENT); 

    int responseCode = con.getResponseCode(); 
    System.out.println("\nSending 'GET' request to URL : " + url); 
    System.out.println("Response Code : " + responseCode); 

    BufferedReader in = new BufferedReader(
      new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = in.readLine()) != null) { 
     response.append(inputLine); 
    } 
    in.close(); 

    //print result 
    System.out.println(response.toString()); 

} 

========================================

URL obj = new URL("http://mkyong.com"); 
    URLConnection conn = obj.openConnection(); 
    Map<String, List<String>> map = conn.getHeaderFields(); 

    System.out.println("Printing Response Header...\n"); 

    for (Map.Entry<String, List<String>> entry : map.entrySet()) { 
     System.out.println("Key : " + entry.getKey() 
          + " ,Value : " + entry.getValue()); 
    } 

    System.out.println("\nGet Response Header By Key ...\n"); 
    String server = conn.getHeaderField("Server"); 

    if (server == null) { 
     System.out.println("Key 'Server' is not found!"); 
    } else { 
     System.out.println("Server - " + server); 
    } 

      System.out.println("\n Done"); 

    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
+0

嘿它的HTTP GET請求。代碼在這裏獲取這行代碼中的url內容:'BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()));' – Peshal

回答

2

URLConnection#connect()

操作依賴於連接,像getContentLength,如果有必要將隱式執行連接。

這包括getOutputStream()getResponseCode()。因此,當您撥打getResponseCode()時,connect()會隱式地爲您調用。

0

您不必顯式調用connect功能,

看到Java文檔

http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#openConnection%28%29

調用URLStreamHandler.openConnection(URL)時的URLConnection的一個新實例被創建每次此URL的協議處理程序的方法。

應該指出的是,URLConnection實例在創建時不建立實際的網絡連接。只有在調用URLConnection.connect()時纔會發生這種情況。

如果對於URL的協議(例如HTTP或JAR),則存在屬於以下包之一或其子包之一的公共專用URLConnection子類:java.lang,java.io,java.util, java.net,返回的連接將是該子類的。例如,對於HTTP,將返回HttpURLConnection,對於JAR,將返回JarURLConnection。

+0

您的引用是準確的。但是我看不到它在哪裏說你不必調用connect函數。你能突出重要的一點嗎? –

相關問題