Android網絡編程概述javascript
首先,應該瞭解的幾個問題:php
1)Android平臺網絡相關API接口html
a) java.net.*(標準Java接口)java
java.net.* 提供與聯網有關的類,包括流、數據包套接字(socket)、Internet協議、常見Http處理等。好比:建立URL,以及 URLConnection/HttpURLConnection對象、設置連接參數、連接到服務器、向服務器寫數據、從服務器讀取數據等通訊。這些在 Java網絡編程中均有涉及。android
b) Org.apache接口git
對於大部分應用程序而言JDK自己提供的網絡功能已遠遠不夠,這時就須要Android提供的Apache HttpClient了。它是一個開源項目,功能更加完善,爲客戶端的Http編程提供高效、最新、功能豐富的工具包支持。
github
c)Android.net.*(Android網絡接口)web
經常使用此包下的類進行Android特有的網絡編程,如:訪問WiFi,訪問Android聯網信息,郵件等功能。
面試
2)網絡架構主要有兩種模式B/S,C/S chrome
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的
1、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("
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來保存要傳遞的參數。另外,還須要設置所使用的字符集。
2、基於Socket通訊
Socket編程比基於URL的網絡編程提供了更高的傳輸效率,更強大的功能和更靈活的控制。在Java中已是層次最低的網絡編程接口,在Java中要直接操做協議中更低的層次,那就只有使用JNI了,那基本屬於本地語言的範疇。
3、其它網絡相關技術
3.一、Android WebView控件
在android app 中嵌入網頁的形式。
此外,經過webview能夠實現HTML<------->javascript<-------->Android Java 交互,訪問本地手機硬件。
例如:
1) webview.addJavascriptInterface(ObjectString 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)
一、服務器端需下載安裝IBM的 Really Small Message Broker (RSMB)(MQTT協議代理),並運行broker;
下載地址:http://www.alphaworks.ibm.com/tech/rsmb
二、PHP服務器端使用SAM 針對MQTT寫的PHP庫(下載連接爲Tokudu PHPMQTT通訊項目),其中send_mqtt.php是一個經過POST接收消息而且經過SAM將消息發送給RSMB的PHP腳本;
三、實例下載:
說明: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是能夠考慮的開發框架之一。