1. 程式人生 > >網路和I/O

網路和I/O

一、網路HttpURLConnection 類

HttpURLConnection 類是基於HTTP協議的,其底層是通過Socket實現的。

URL請求的類別:
分為二類,GET與POST請求。二者的區別在於:
a:) get請求可以獲取靜態頁面,也可以把引數放在URL字串後面,傳遞給servlet,
b:) post與get的不同之處在於post的引數不是放在URL字串裡面,而是放在http請求的正文內。
這裡寫圖片描述

Http協議支援的操作有GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE,其中最最常用的還是GET和POST操作,下面我們看一下GET和POST的區別。

GET:
GET請求可以被快取。 我們之前提到,當傳送鍵值對資訊時,可以在URL上面直接追加鍵值對引數。當用GET請求傳送鍵值對時,鍵值對會隨著URL一起傳送的。 由於GET請求傳送的鍵值對時隨著URL一起傳送的,所以一旦該URL被黑客截獲,那麼就能看到傳送的鍵值對資訊,所以GET請求的安全性很低,不能用GET請求傳送敏感的資訊(比如使用者名稱密碼)。 由於URL不能超過2048個字元,所以GET請求傳送資料是有長度限制的。 由於GET請求較低的安全性,我們不應該用GET請求去執行增加、刪除、修改等的操作,應該只用它獲取資料。

POST:
POST請求從不會被快取。 POST請求的URL中追加鍵值對引數,不過這些鍵值對引數不是隨著URL傳送的,而是被放入到請求體中傳送的,這樣安全性稍微好一些。 應該用POST請求傳送敏感資訊,而不是用GET。 由於可以在請求體中傳送任意的資料,所以理論上POST請求不存在傳送資料大小的限制。 當執行增減、刪除、修改等操作時,應該使用POST請求,而不應該使用GET請求。

a. 從客戶端得到服務端資料 GET

1、 示例1,如何得到HttpURLConnection 類,及使用它的各種方法,得到輸入流。

  URL url=new URL(urlString);

  HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//            連結超時時間
     connection.setConnectTimeout(30000);
     connection.setRequestMethod("GET");
//           開始請求
     connection.connect();
//          請求的狀態碼,200是成功,404等
int responseCode=connection.getResponseCode(); String responseMessage=connection.getResponseMessage(); String result=null; if(responseCode==HttpURLConnection.HTTP_OK){ InputStream inputStream=connection.getInputStream();

示例2,如何得到HttpURLConnection 類,及使用它的各種方法,得到輸入流。

 URL url = new URL(urlString); //URL物件  

 conn = (HttpURLConnection)url.openConnection(); //使用URL開啟一個連結  
 conn.setDoInput(true); //允許輸入流,即允許下載  
 conn.setDoOutput(true); //允許輸出流,即允許上傳  
 conn.setUseCaches(false); //不使用緩衝  
 conn.setRequestMethod("GET"); //使用get請求  
 is = conn.getInputStream();   //獲取輸入流,此時才真正建立連結 

b.客戶端向服務端傳送資料 POST

 // 設定是否向httpUrlConnection輸出,因為這個是post請求,引數要放在   
 2  // http正文內,因此需要設為true, 預設情況下是false;   
 3  httpUrlConnection.setDoOutput(true);   
 4   
 5  // 設定是否從httpUrlConnection讀入,預設情況下是true;   
 6  httpUrlConnection.setDoInput(true);   
 7   
 8  // Post 請求不能使用快取   
 9  httpUrlConnection.setUseCaches(false);   
10   
11  // 設定傳送的內容型別是可序列化的java物件   
12  // (如果不設此項,在傳送序列化物件時,當WEB服務預設的不是這種型別時可能拋java.io.EOFException)   
13  httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");   
14   
15  // 設定請求的方法為"POST",預設是GET   
16  httpUrlConnection.setRequestMethod("POST");   
17   
18  // 連線,從上述第2條中url.openConnection()至此的配置必須要在connect之前完成,   
19          httpUrlConnection.connect();  

 // 此處getOutputStream會隱含的進行connect(即:如同呼叫上面的connect()方法,   
 // 所以在開發中不呼叫上述的connect()也可以)。   
  OutputStream outStrm = httpUrlConnection.getOutputStream();

二、I/O

a.從網路得到資料輸入流,從輸入流解析到資料

1.a 一種解析輸入流的方式

Reader reader=new InputStreamReader(inputStream,"UTF-8");
char[] buffer=new char[1024];
reader.read(buffer);

result=new String(buffer);

1.b 一種解析輸入流的方式

reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));

 String strRead = null;
 while ((strRead = reader.readLine()) != null) {
     sbf.append(strRead);
     sbf.append("\r\n");
  }
  reader.close();
  result = sbf.toString();

2.解析為圖片, 引數is是輸入流

 // ImageView設定Bitmap,用BitMap工廠解析輸入流
 mIvShow.setImageBitmap(BitmapFactory.decodeStream(is));

b.客戶端向服務端傳送資料,POST時 輸出流

    //獲取conn的輸出流
    OutputStream os = conn.getOutputStream();
   //讀取assets目錄下的person.xml檔案,將其位元組陣列作為請求體
    requestBody = getBytesFromAssets("person.xml");
   //將請求體寫入到conn的輸出流中
    os.write(requestBody);
   //記得呼叫輸出流的flush方法
     os.flush();
   //關閉輸出流
    os.close();