天天看點

【Android】Android網絡程式設計概述

android網絡程式設計概述

首先,應該了解的幾個問題:

1)android平台網絡相關api接口

 a) java.net.*(标準java接口)

 java.net.*提供與聯網有關的類,包括流、資料包套接字(socket)、internet協定、常見http處理等。比如:建立url,以及urlconnection/httpurlconnection對象、設定連結參數、連結到伺服器、向伺服器寫資料、從伺服器讀取資料等通信。這些在java網絡程式設計中均有涉及。

 b) org.apache接口

對于大部分應用程式而言jdk本身提供的網絡功能已遠遠不夠,這時就需要android提供的apache httpclient了。它是一個開源項目,功能更加完善,為用戶端的http程式設計提供高效、最新、功能豐富的工具包支援。

 c)android.net.*(android網絡接口)

常常使用此包下的類進行android特有的網絡程式設計,如:通路wifi,通路android聯網資訊,郵件等功能。

2)網絡架構主要有兩種模式b/s,c/s 

  b/s----》就是浏覽器/伺服器端模式了,通過應用層的http協定通信,不需要特定用戶端軟體,而是需要統一規範的用戶端,簡而言之就是android網絡浏覽器(如chrome,ucweb,qq浏覽器等等)通路web伺服器端的方式了。

 c/s-----》就用戶端/伺服器端模式,通過任意的網絡協定通信,需要特定的用戶端軟體。

3)伺服器端傳回用戶端的内容有三種方式:

a)以html代碼的形式傳回。

b)以xml字元串的形式傳回,做android開發時這種方式比較多。傳回的資料需要通過xml解析(sax、dom,pull,等)器進行解析(必備知識)。

c)以json對象的方式傳回。

android的網絡程式設計分為2種:基于http協定的,和基于socket的

一、http協定

  基于tcp/ip協定之上的協定

1.1httpurlconnection連接配接url

1)建立一個url對象

url url = new url(http://www.baidu.com);

2)利用httpurlconnection對象從網絡中擷取網頁資料

httpurlconnection conn = (httpurlconnection) url.openconnection();

3)設定連接配接逾時

conn.setconnecttimeout(6*1000);

4)對響應碼進行判斷

if (conn.getresponsecode() != 200)    //從internet擷取網頁,發送請求,将網頁以流的形式讀回來

throw new runtimeexception("請求url失敗");

5)得到網絡傳回的輸入流

inputstream is = conn.getinputstream();

6)string result = readdata(is, "gbk"); //檔案流輸入出檔案用outstream.write

7)conn.disconnect();

總結:

--記得設定連接配接逾時,如果網絡不好,android系統在超過預設時間會收回資源中斷操作.

--傳回的響應碼200,是成功.

--在android中對檔案流的操作和java se上面是一樣的.

--在對大檔案的操作時,要将檔案寫到sdcard上面,不要直接寫到手機記憶體上.

--操作大檔案是,要一遍從網絡上讀,一遍要往sdcard上面寫,減少手機記憶體的使用.這點很重要,面試經常會被問到.

--對檔案流操作完,要記得及時關閉.

1.2向伺服器端發送請求參數

步驟:

1)建立url對象:url realurl = new url(requesturl);

2)通過httpurlconnection對象,向網絡位址發送請求

httpurlconnection conn = (httpurlconnection) realurl.openconnection();

3)設定容許輸出:conn.setdooutput(true);

4)設定不使用緩存:conn.setusecaches(false);

5)設定使用post的方式發送:conn.setrequestmethod("post");

6)設定維持長連接配接:conn.setrequestproperty("connection", "keep-alive");

7)設定檔案字元集:conn.setrequestproperty("charset", "utf-8");

8)設定檔案長度:conn.setrequestproperty("content-length", string.valueof(data.length));

9)設定檔案類型:conn.setrequestproperty("content-type","application/x-www-form-urlencoded");

10)設定http請求頭

conn.setrequestproperty("accept“,” image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");

設定語言:conn.setrequestproperty("accept-language“,"zh-cn");

conn.setrequestproperty("

11)以流的方式輸出.

--發送post請求必須設定允許輸出

--不要使用緩存,容易出現問題.

--在開始用httpurlconnection對象的setrequestproperty()設定,就是生成html檔案頭.

1.3.向伺服器端發送xml資料(也稱為實體entity)

xml格式是通信的标準語言,android系統也可以通過發送xml檔案傳輸資料.

1)将生成的xml檔案寫入到byte數組中,并設定為utf-8:byte[] xmlbyte = xml.tostring().getbytes("utf-8");

2)建立url對象,并指定位址和參數:url url = new url( http://localhost:8080/itcast/contanctmanage.do?method=readxml );

3)獲得連結:httpurlconnection conn = (httpurlconnection) url.openconnection();

4)設定連接配接逾時:conn.setconnecttimeout(6* 1000);

5)設定允許輸出conn.setdooutput(true);

6)設定不使用緩存:conn.setusecaches(false);

7)設定以post方式傳輸:conn.setrequestmethod("post");           

8)維持長連接配接:conn.setrequestproperty("connection", "keep-alive");

9)設定字元集:conn.setrequestproperty("charset", "utf-8");

10)設定檔案的總長度:conn.setrequestproperty("content-length", string.valueof(xmlbyte.length));

11)設定檔案類型:conn.setrequestproperty("content-type", "text/xml; charset=utf-8" );

12)以檔案流的方式發送xml資料:outstream.write(xmlbyte);

--我們使用的是用html的方式傳輸檔案,這個方式隻能傳輸一般在5m一下的檔案.

--傳輸大檔案不适合用html的方式,傳輸大檔案我們要面向socket程式設計.確定程式的穩定性

--将位址和參數存到byte數組中:byte[] data = params.tostring().getbytes();

1.4 利用apache的httpclient實作android用戶端發送實體entity

 以上為直接利用http協定來實作的,其實android已經內建了第三方開源項目-------org.apache.http.client.httpclient,可以直接參考它提供的api使用。

http clients encapsulate a smorgasbord of objects required to execute http requests while handling cookies, authentication, connection management, and other features. thread safety of http clients depends on the implementation and configuration of the specific client.

使用post方法進行參數傳遞時,需要使用namevaluepair來儲存要傳遞的參數。另外,還需要設定所使用的字元集。

二、基于socket通信

  socket程式設計比基于url的網絡程式設計提供了更高的傳輸效率,更強大的功能和更靈活的控制。在java中已經是層次最低的網絡程式設計接口,在java中要直接操作協定中更低的層次,那就隻有使用jni了,那基本屬于本地語言的範疇。

【Android】Android網絡程式設計概述
【Android】Android網絡程式設計概述

三、其它網絡相關技術

3.1、android webview控件

   在android app 中嵌入網頁的形式。

     此外,通過webview可以實作html<------->javascript<-------->android java 互動,通路本地手機硬體。

 例如:

1)   webview.addjavascriptinterface(object obj, string interfacename))方法,  讓java方法可以在javascript中被調用;

void

addjavascriptinterface( object obj,  string interfacename)

use this function to bind an object to javascript so that the methods can be accessed from javascript.

2)java中調用javascript腳本中的方法

  webview.loadurl("javascript:show('"+json+"')");//調用js的show方法

3.2基于soap協定與webservice網絡互動 ------------ksoap2

   簡單對象通路協定,簡單對象通路協定(soap)是一種輕量的、簡單的、基于 xml 的協定。

通過第三方提供的架包ksoap2-android-assembly-2.4-jar-with-dependencies.jar,我們可以向伺服器進行請求調用自己需要的服務。

3.3 實作伺服器推送

通過建立持久連接配接的方法,伺服器端發送資訊給手機android使用者。

方法一:mqtt協定(執行個體android+php)

1、伺服器端需下載下傳安裝ibm的 really small message broker (rsmb)(mqtt協定代理),并運作broker;

下載下傳位址:http://www.alphaworks.ibm.com/tech/rsmb

2、php伺服器端使用sam 針對mqtt寫的php庫(下載下傳連結為tokudu phpmqtt通信項目),其中send_mqtt.php是一個通過post接收消息并且通過sam将消息發送給rsmb的php腳本;

3、執行個體下載下傳:

說明:http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

android用戶端:https://github.com/tokudu/androidpushnotificationsdemo

php伺服器端:https://github.com/tokudu/phpmqttclient

方法二:xmpp協定(執行個體android+jsp)

xmpp : the extensible messaging and presence protocol (可擴充通訊和表示協定) xmpp 以 jabber 協定為基礎,而 jabber 是即時通訊中常用的開放式協定。

下載下傳位址: http://sourceforge.net/projects/androidpn/files/

解壓伺服器端,點選bin/run.bat運作,通路:http://127.0.0.1:7070/index.do,就可以看伺服器端的管理頁面,用這個管理頁面,就要向用戶端push消息。

方法三:使用apns (android push notification service)

http://www.push-notification.org/

apns (android push notification service) 是一種在 android 上輕松實作 push notification 的功能的解決方案. 隻需申請一個 api key, 經過簡單的步驟即可實作 push notification 的功能.

3.4 phonegap 

   提到移動3g時代網絡應用,不得不提一下phonegap了。

   phonegap利用html,css,javascript, 支援android、iphone,windows phone、palm os、sybian....

   如果考慮開發一款應用,适用于大多數智能手機,phonegap是可以考慮的開發架構之一。

相關連結:

1.封裝一個http請求的輔助類,javascript:void(0)

繼續閱讀