轉載(http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/21/1990525.html)
關于URLConnection,網上很多回答都是對API的翻譯,很崩潰,我是看了很多之后,然后看API才發現的。此后我會吸取教訓,一遇到問題首先看API,也建議大家這樣,英文的最好,不是太相信那些翻譯的,呵呵,感覺還是自己斟酌理解的好吧。下面我就解讀一下URLConnection的API,雖然也是一種翻譯,但是結合我自己的理解,還有一點親自調試得出的結論。
URLConnection是所有表示應用程序與URL之間通信連接的類的父類(super class),該類的實例可以用來對由URL引用的資源進行讀取和寫入操作。
HttpURLConnection 是支持HTTP特定功能的URLConnection,還有JarConnection是URLConnection的直接子類。
創建URLConnection對象主要要經歷兩步:
第一步是creat:URLConnection conn = url.openConnection();
第二步是connect:conn.connect();//這兩個是不同的,見下面調試
在created和connected之間可以設置一些變量選項(如setDoInput,超時等),而如果connect之后再設置就會引發異常(網上也有這個問題)
在需要連接才能執行的操作(如getInputStream等應用層操作),程序會暗中(implicitly)執行連接
一旦連接可用,就可以訪問獲取資源,如執行getInputStream()等,對于HttpURLConnection,還有conn.getResponseCode()==200來判定服務器是否返回正確的應答碼以表明請求被接受。
在URLConnection中,有一個域boolean connected?,值為true表明已經建立到指定URL的連接;false則沒有(華麗的標記)
connect()?? ?當連接還未被建立時,打開一個communications link,而如果這個鏈接已經被打開(connected值設置為true)則 ignore it 。
下面編了一個小程序進行調試:
?
URL url = new URL("http://www.google.cn");
URLConnection conn = url.openConnection();
conn.setConnectTimeout(10000);
conn.connect();
InputStream inStream = conn.getInputStream();
當程序執行完openConnection()之后,域connected值還是false,說明這時候還未連接。等執行到connect()之后,connected才變為true,說明這時候才完成連接。而當我注釋掉connect()后,再運行程序,connected值到getInputStream執行完又變為true,這時候知道getInputStream會使連接暗中被執行。
綜上,對于一般需要連接才執行的操作(可能也有不需要連接的操作吧~~),connect()是可以省略的。但是只有在connect()執行完,連接才正式建立,而不是openConnection(只是創建了一個連接對象)
?
?
示列
轉載(http://caspers.iteye.com/blog/212876#)
1 package com.test; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.net.URL; 9 import java.net.URLConnection; 10 11 public class TestPost { 12 13 public static void testPost() throws IOException { 14 15 /** 16 * 首先要和URL下的URLConnection對話。 URLConnection可以很容易的從URL得到。比如: // Using 17 * java.net.URL and //java.net.URLConnection 18 */ 19 URL url = new URL("http://www.faircanton.com/message/check.asp"); 20 URLConnection connection = url.openConnection(); 21 /** 22 * 然后把連接設為輸出模式。URLConnection通常作為輸入來使用,比如下載一個Web頁。 23 * 通過把URLConnection設為輸出,你可以把數據向你個Web頁傳送。下面是如何做: 24 */ 25 connection.setDoOutput(true); 26 /** 27 * 最后,為了得到OutputStream,簡單起見,把它約束在Writer并且放入POST信息中,例如: ... 28 */ 29 OutputStreamWriter out = new OutputStreamWriter(connection 30 .getOutputStream(), "8859_1"); 31 out.write("username=kevin&password=*********"); //post的關鍵所在! 32 // remember to clean up 33 out.flush(); 34 out.close(); 35 /** 36 * 這樣就可以發送一個看起來象這樣的POST: 37 * POST /jobsearch/jobsearch.cgi HTTP 1.0 ACCEPT: 38 * text/plain Content-type: application/x-www-form-urlencoded 39 * Content-length: 99 username=bob password=someword 40 */ 41 // 一旦發送成功,用以下方法就可以得到服務器的回應: 42 String sCurrentLine; 43 String sTotalString; 44 sCurrentLine = ""; 45 sTotalString = ""; 46 InputStream l_urlStream; 47 l_urlStream = connection.getInputStream(); 48 // 傳說中的三層包裝阿! 49 BufferedReader l_reader = new BufferedReader(new InputStreamReader( 50 l_urlStream)); 51 while ((sCurrentLine = l_reader.readLine()) != null) { 52 sTotalString += sCurrentLine + "\r\n"; 53 54 } 55 System.out.println(sTotalString); 56 } 57 58 public static void main(String[] args) throws IOException { 59 60 testPost(); 61 62 } 63 64 }
?