java網絡編程--httpurlconnection


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(); 
 
HttpURLConnection連接問題: 
OutputStream outStrm = httpUrlConnection.getOutputStream(); 
 
 HttpURLConnection寫數據與發送數據問題: 
 
// 現在通過輸出流對象構建對象輸出流對象,以實現輸出可序列化的對象。 
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(); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM