Android操作HTTP实现与服务器通信
出處:http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html
本示例以Servlet為例,演示Android與Servlet的通信。
眾所周知,Android與服務器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post兩種方式。至于Socket通信會在以后的博文中介紹。
 
 
HTTP協(xié)議簡介:?
HTTP (Hypertext Transfer Protocol ),是Web聯(lián)網(wǎng)的基礎,也是手機聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種協(xié)議。?
?
HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務器回送響應,在請求結(jié)束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。? 在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。? 在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結(jié)束后再發(fā)送下一個請求。
?
由于HTTP在每次請求結(jié)束后都會主動釋放連接,因此HTTP連接是一種“短連接”、“無狀態(tài)”,要保持客戶端程序的在線狀態(tài),需要不斷地向服務器發(fā)起連接請求。通常的做法是即使不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務器發(fā)送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網(wǎng)絡已經(jīng)斷開。?
基于HTTP1.0協(xié)議的客戶端在每次向服務器發(fā)出請求后,服務器就會向客戶端返回響應消息,在確認客戶端已經(jīng)收到響應消息后,服務端就會關閉網(wǎng)絡連接。在這個數(shù)據(jù)傳輸過程中,并不保存任何歷史信息和狀態(tài)信息,因此,HTTP協(xié)議也被認為是無狀態(tài)的協(xié)議。
? HTTP1.1和HTTP1.0相比較而言,最大的區(qū)別就是增加了持久連接支持。當客戶端使用HTTP1.1協(xié)議連接到服務器后,服務器就將關閉客戶端連接的主動權(quán)交還給客戶端;也就是說,只要不調(diào)用Socket類的close方法關閉網(wǎng)絡連接,就可以繼續(xù)向服務器發(fā)送HTTP請求。
?
HTTP連接使用的是“請求—響應”的方式(2次握手),不僅在請求時需要先建立連接,而且需要客戶端向服務器發(fā)出請求后,服務器端才能回復數(shù)據(jù)。而Socket連接在雙方建立起連接后就可以直接進行數(shù)據(jù)的傳輸
?
? HTTP協(xié)議的特點:
? 支持B/S及C/S模式;
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。
靈活:HTTP 允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type 加以標記;
無狀態(tài):HTTP 協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據(jù)量增大。
?
HTTP協(xié)議請求方法:?
請求行中包括了請求方法,解釋如下:
GET 請求獲取Request-URI 所標識的資源;
POST 在Request-URI 所標識的資源后附加新的數(shù)據(jù);
HEAD 請求獲取由Request-URI 所標識的資源的響應消息報頭
PUT 請求服務器存儲一個資源,并用Request-URI 作為其標識
DELETE 請求服務器刪除Request-URI 所標識的資源;
TRACE 請求服務器回送收到的請求信息,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
Get與Post請求區(qū)別:?
Post請求可以向服務器傳送數(shù)據(jù),而且數(shù)據(jù)放在HTML HEADER內(nèi)一起傳送到服務端URL地址,數(shù)據(jù)對用戶不可見。而get是把參數(shù)數(shù)據(jù)隊列加到提交的URL中,值和表單內(nèi)各個字段一一對應,? 例如(http://www.baidu.com/s?w=%C4&inputT=2710)
get 傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
get安全性非常低,post安全性較高。
項目結(jié)構(gòu)圖:?
?
?
??get方式:
 
?? ? ? ? ?get機制用的是在URL地址里面通過?號間隔,然后以name=value的形式給客戶端傳遞參數(shù)。所以首先要在Android工程下的AndroidGetTest.java中onCreate方法定義好其URL地址以及要傳遞的參數(shù),然后通過URL打開一個HttpURLConnection鏈接,此鏈接可以獲得InputStream字節(jié)流對象,也是往服務端輸出和從服務端返回數(shù)據(jù)的重要過程,而若服務端response.getInputStream.write()往andorid返回信息時候,就可以通過InputStreamReader作轉(zhuǎn)換,將返回來的數(shù)據(jù)用BufferReader顯示出來。
具體代碼如下:
?? ? ? ? ?Servlet端接收數(shù)據(jù)并返回通知:??
?
? ??Android端發(fā)送消息并接收Servlet返回的消息:
?
?post方式:
 
?? ? ? ? post傳輸方式不在URL里傳遞,也正好解決了get傳輸量小、容易篡改及不安全等一系列不足。主要是通
過對HttpURLConnection的設置,讓其支持post傳輸方式,然后在通過相關屬性傳遞參數(shù)(若需要傳遞中文字符,則可以通過URLEncoder編碼,而在獲取端采用URLDecoder解碼即可)??
?
 
 
 最后,希望轉(zhuǎn)載的朋友能夠尊重作者的勞動成果,加上轉(zhuǎn)載地址:http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html??謝謝。
 
 完畢。^_^
?
總結(jié)
以上是生活随笔為你收集整理的Android操作HTTP实现与服务器通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 微软系统封装工具ImageX使用方法及实
 - 下一篇: win7硬盘安装过程图解