HttpURLConnection是基於HTTP協議的,其底層通過socket通信實現。如果不設置超時(timeout),在網絡異常的情況下,可能會導致程序僵死而不繼續往下執行。可以通過以下兩個語句來設置相應的超時:
System.setProperty("sun.net.client.defaultConnectTimeout", 超時毫秒數字符串);
System.setProperty("sun.net.client.defaultReadTimeout", 超時毫秒數字符串);
其中: sun.net.client.defaultConnectTimeout:連接主機的超時時間(單位:毫秒)
sun.net.client.defaultReadTimeout:從主機讀取數據的超時時間(單位:毫秒)
URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp"); 
URLConnection rulConnection = url.openConnection();// 此處的urlConnection對象實際上是根據URL的
// 請求協議(此處是http)生成的URLConnection類 
// 為HttpURLConnection類型的對象,以便用到 
HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
HttpURLConnection對象參數問題
// 設置是否向httpUrlConnection輸出,因為這個是post請求,參數要放在
// http正文內,因此需要設為true, 默認情況下是false;
httpUrlConnection.setDoOutput(true);
// 設置是否從httpUrlConnection讀入,默認情況下是true;
httpUrlConnection.setDoInput(true);
// Post 請求不能使用緩存
httpUrlConnection.setUseCaches(false);
// 設定傳送的內容類型是可序列化的java對象
// (如果不設此項,在傳送序列化對象時,當WEB服務默認的不是這種類型時可能拋java.io.EOFException)
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
// 設定請求的方法為"POST",默認是GET
httpUrlConnection.setRequestMethod("POST");
// 連接,從上述第2條中url.openConnection()至此的配置必須要在connect之前完成,
httpUrlConnection.connect();
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
// 向對象輸出流寫出數據,這些數據將存到內存緩沖區中
objOutputStrm.writeObject(new String("我是測試數據"));
// 刷新對象輸出流,將任何字節都寫入潛在的流中(些處為ObjectOutputStream)
objOutputStm.flush();
// 關閉流對象。此時,不能再向對象輸出流寫入任何數據,先前寫入的數據存在於內存緩沖區中,
// 在調用下邊的getInputStream()函數時才把准備好的http請求正式發送到服務器
objOutputStm.close();
// 調用HttpURLConnection連接對象的getInputStream()函數,
// 將內存緩沖區中封裝好的完整的HTTP請求電文發送到服務端。
InputStream inStrm = httpConn.getInputStream(); // <===注意,實際發送請求的代碼段就在這里
// 上邊的httpConn.getInputStream()方法已調用,本次HTTP請求已結束,下邊向對象輸出流的輸出已無意義,
// 既使對象輸出流沒有調用close()方法,下邊的操作也不會向對象輸出流寫入任何數據.
// 因此,要重新發送數據時需要重新創建連接、重新設參數、重新創建流對象、重新寫數據、
// 重新發送數據(至於是否不用重新這些操作需要再研究)
objOutputStm.writeObject(new String(""));
httpConn.getInputStream();
