Android http通訊

Android操做HTTP實現與服務器通訊

本示例以Servlet爲例,演示Android與Servlet的通訊html

衆所周知,Android與服務器通訊一般採用HTTP通訊方式和Socket通訊方式,而HTTP通訊方式又分get和post兩種方式。至於Socket通訊會在之後的博文中介紹。

java

HTTP協議簡介: 安全

HTTP (Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網經常使用的協議之一,HTTP協議是創建在TCP協議之上的一種協議。 服務器

 

HTTP鏈接最顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後,會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」。  在HTTP 1.0中,客戶端的每次請求都要求創建一次單獨的鏈接,在處理完本次請求後,就自動釋放鏈接。  在HTTP 1.1中則能夠在一次鏈接中處理多個請求,而且多個請求能夠重疊進行,不須要等待一個請求結束後再發送下一個請求。網絡

 

因爲HTTP在每次請求結束後都會主動釋放鏈接,所以HTTP鏈接是一種「短鏈接」、「無狀態」,要保持客戶端程序的在線狀態,須要不斷地向服務器發起鏈接請求。一般的作法是即便不須要得到任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次「保持鏈接」的請求,服務器在收到該請求後對客戶端進行回覆,代表知道客戶端「在線」。若服務器長時間沒法收到客戶端的請求,則認爲客戶端「下線」,若客戶端長時間沒法收到服務器的回覆,則認爲網絡已經斷開。 post

 

基於HTTP1.0協議的客戶端在每次向服務器發出請求後,服務器就會向客戶端返回響應消息,在確認客戶端已經收到響應消息後,服務端就會關閉網絡鏈接。在這個數據傳輸過程當中,並不保存任何歷史信息和狀態信息,所以,HTTP協議也被認爲是無狀態的協議。性能

  HTTP1.1和HTTP1.0相比較而言,最大的區別就是增長了持久鏈接支持。當客戶端使用HTTP1.1協議鏈接到服務器後,服務器就將關閉客戶端鏈接的主動權交還給客戶端;也就是說,只要不調用Socket類的close方法關閉網絡鏈接,就能夠繼續向服務器發送HTTP請求。測試

 

HTTP鏈接使用的是「請求—響應」的方式(2次握手),不只在請求時須要先創建鏈接,並且須要客戶端向服務器發出請求後,服務器端才能回覆數據。而Socket鏈接在雙方創建起鏈接後就能夠直接進行數據的傳輸編碼

 

  HTTP協議的特色:url

  支持B/S及C/S模式;

簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。

靈活:HTTP 容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type 加以標記;

無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。

 

HTTP協議請求方法: 

請求行中包括了請求方法,解釋以下:

GET 請求獲取Request-URI 所標識的資源;

POST 在Request-URI 所標識的資源後附加新的數據;

HEAD 請求獲取由Request-URI 所標識的資源的響應消息報頭

PUT 請求服務器存儲一個資源,並用Request-URI 做爲其標識

DELETE 請求服務器刪除Request-URI 所標識的資源;

TRACE 請求服務器回送收到的請求信息,主要用於測試或診斷

CONNECT 保留未來使用

OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求

 

Get與Post請求區別: 

Post請求能夠向服務器傳送數據,並且數據放在HTML HEADER內一塊兒傳送到服務端URL地址,數據對用戶不可見。而get是把參數數據隊列加到提交的URL中,值和表單內各個字段一一對應, 例如(http://www.baidu.com/s?w=%C4&inputT=2710)

get 傳送的數據量較小,不能大於2KB。post傳送的數據量較大,通常被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。

get安全性很是低,post安全性較高。

項目結構圖: 

 

 

  get方式:

          get機制用的是在URL地址裏面經過?號間隔,而後以name=value的形式給客戶端傳遞參數。因此首先要在Android工程下的AndroidGetTest.java中onCreate方法定義好其URL地址以及要傳遞的參數,而後經過URL打開一個HttpURLConnection連接,此連接能夠得到InputStream字節流對象,也是往服務端輸出和從服務端返回數據的重要過程,而若服務端response.getInputStream.write()往andorid返回信息時候,就能夠經過InputStreamReader做轉換,將返回來的數據用BufferReader顯示出來。

具體代碼以下:

          Servlet端接收數據並返回通知: 

 

 

    Android端發送消息並接收Servlet返回的消息:

 

 post方式:

         post傳輸方式不在URL裏傳遞,也正好解決了get傳輸量小、容易篡改及不安全等一系列不足。主要是通

過對HttpURLConnection的設置,讓其支持post傳輸方式,而後在經過相關屬性傳遞參數(若須要傳遞中文字符,則能夠經過URLEncoder編碼,而在獲取端採用URLDecoder解碼便可) 

 

 



轉自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html

相關文章
相關標籤/搜索