Android與伺服器通訊通常採用HTTP通訊方式和Socket通訊方式,而HTTP通訊方式又分get和post兩種方式。至於Socket通訊會在以後的博文中介紹。
HTTP協議簡介:
HTTP (Hypertext Transfer Protocol ),是Web連網的基礎,也是手機連網常用的協議之一,HTTP協議是建立在TCP協議之上的一種協議。
HTTP串連最顯著的特點是用戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放串連。從建立串連到關閉串連的過程稱為“一次串連”。 在HTTP 1.0中,用戶端的每次請求都要求建立一次單獨的串連,在處理完本次請求後,就自動釋放串連。 在HTTP 1.1中則可以在一次串連中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
由於HTTP在每次請求結束後都會主動釋放串連,因此HTTP串連是一種“短串連”、“無狀態”,要保持用戶端程式的線上狀態,需要不斷地向伺服器發起串連請求。通常的做法是即使不需要獲得任何資料,用戶端也保持每隔一段固定的時間向伺服器發送一次“保持串連”的請求,伺服器在收到該請求後對用戶端進行回複,表明知道用戶端“線上”。若伺服器長時間無法收到用戶端的請求,則認為用戶端“下線”,若用戶端長時間無法收到伺服器的回複,則認為網路已經斷開。
基於HTTP1.0協議的用戶端在每次向伺服器發出請求後,伺服器就會向用戶端返迴響應訊息,在確認用戶端已經收到響應訊息後,服務端就會關閉網路連接。在這個資料轉送過程中,並不儲存任何曆史資訊和狀態資訊,因此,HTTP協議也被認為是無狀態的協議。
HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久串連支援。當用戶端使用HTTP1.1協議串連到伺服器後,伺服器就將關閉用戶端串連的主動權交還給用戶端;也就是說,只要不調用Socket類的close方法關閉網路連接,就可以繼續向伺服器發送HTTP請求。
HTTP串連使用的是“請求—響應”的方式(2次握手),不僅在請求時需要先建立串連,而且需要用戶端向伺服器發出請求後,伺服器端才能回複資料。而Socket串連在雙方建立起串連後就可以直接進行資料的傳輸
HTTP協議的特點:
支援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解碼即可)