卓安特保|山東卓安|聯(lián)網(wǎng)報(bào)警|濟(jì)南監(jiān)控安裝|15562629707|13361029977|李田軍
首先,應(yīng)該了解的幾個(gè)問(wèn)題:
1)Android平臺(tái)網(wǎng)絡(luò)相關(guān)API接口
a) java.net.*(標(biāo)準(zhǔn)Java接口)
java.net.*提供與聯(lián)網(wǎng)有關(guān)的類,包括流、數(shù)據(jù)包套接字(socket)、Internet協(xié)議、常見(jiàn)Http處理等。比如:創(chuàng)建URL,以及URLConnection/HttpURLConnection對(duì)象、設(shè)置鏈接參數(shù)、鏈接到服務(wù)器、向服務(wù)器寫(xiě)數(shù)據(jù)、從服務(wù)器讀取數(shù)據(jù)等通信。這些在Java網(wǎng)絡(luò)編程中均有涉及。
b) Org.apache接口
對(duì)于大部分應(yīng)用程序而言JDK本身提供的網(wǎng)絡(luò)功能已遠(yuǎn)遠(yuǎn)不夠,這時(shí)就需要Android提供的Apache HttpClient了。它是一個(gè)開(kāi)源項(xiàng)目,功能更加完善,為客戶端的Http編程提供高效、最新、功能豐富的工具包支持。
c)Android.net.*(Android網(wǎng)絡(luò)接口)
常常使用此包下的類進(jìn)行Android特有的網(wǎng)絡(luò)編程,如:訪問(wèn)WiFi,訪問(wèn)Android聯(lián)網(wǎng)信息,郵件等功能。
2)網(wǎng)絡(luò)架構(gòu)主要有兩種模式B/S,C/S
B/S----》就是瀏覽器/服務(wù)器端模式了,通過(guò)應(yīng)用層的HTTP協(xié)議通信,不需要特定客戶端軟件,而是需要統(tǒng)一規(guī)范的客戶端,簡(jiǎn)而言之就是Android網(wǎng)絡(luò)瀏覽器(如chrome,UcWeb,QQ瀏覽器等等)訪問(wèn)web服務(wù)器端的方式了。
C/S-----》就客戶端/服務(wù)器端模式,通過(guò)任意的網(wǎng)絡(luò)協(xié)議通信,需要特定的客戶端軟件。
3)服務(wù)器端返回客戶端的內(nèi)容有三種方式:
a)以HTML代碼的形式返回。
b)以XML字符串的形式返回,做Android開(kāi)發(fā)時(shí)這種方式比較多。返回的數(shù)據(jù)需要通過(guò)XML解析(SAX、DOM,Pull,等)器進(jìn)行解析(必備知識(shí))。
c)以json對(duì)象的方式返回。
Android的網(wǎng)絡(luò)編程分為2種:基于http協(xié)議的,和基于socket的
一、HTTP協(xié)議
基于TCP/IP協(xié)議之上的協(xié)議
1.1HttpURLConnection連接URL
1)創(chuàng)建一個(gè)URL對(duì)象
URL url = new URL(http://www.baidu.com);
2)利用HttpURLConnection對(duì)象從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù)
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3)設(shè)置連接超時(shí)
conn.setConnectTimeout(6*1000);
4)對(duì)響應(yīng)碼進(jìn)行判斷
if (conn.getResponseCode() != 200) //從Internet獲取網(wǎng)頁(yè),發(fā)送請(qǐng)求,將網(wǎng)頁(yè)以流的形式讀回來(lái)
throw new RuntimeException('請(qǐng)求url失敗');
5)得到網(wǎng)絡(luò)返回的輸入流
InputStream is = conn.getInputStream();
6)String result = readData(is, 'GBK'); //文件流輸入出文件用outStream.write
7)conn.disconnect();
總結(jié):
--記得設(shè)置連接超時(shí),如果網(wǎng)絡(luò)不好,Android系統(tǒng)在超過(guò)默認(rèn)時(shí)間會(huì)收回資源中斷操作.
--返回的響應(yīng)碼200,是成功.
--在Android中對(duì)文件流的操作和JAVA SE上面是一樣的.
--在對(duì)大文件的操作時(shí),要將文件寫(xiě)到SDCard上面,不要直接寫(xiě)到手機(jī)內(nèi)存上.
--操作大文件是,要一遍從網(wǎng)絡(luò)上讀,一遍要往SDCard上面寫(xiě),減少手機(jī)內(nèi)存的使用.這點(diǎn)很重要,面試經(jīng)常會(huì)被問(wèn)到.
--對(duì)文件流操作完,要記得及時(shí)關(guān)閉.
1.2向服務(wù)器端發(fā)送請(qǐng)求參數(shù)
步驟:
1)創(chuàng)建URL對(duì)象:URL realUrl = new URL(requestUrl);
2)通過(guò)HttpURLConnection對(duì)象,向網(wǎng)絡(luò)地址發(fā)送請(qǐng)求
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
3)設(shè)置容許輸出:conn.setDoOutput(true);
4)設(shè)置不使用緩存:conn.setUseCaches(false);
5)設(shè)置使用POST的方式發(fā)送:conn.setRequestMethod('POST');
6)設(shè)置維持長(zhǎng)連接:conn.setRequestProperty('Connection', 'Keep-Alive');
7)設(shè)置文件字符集:conn.setRequestProperty('Charset', 'UTF-8');
8)設(shè)置文件長(zhǎng)度:conn.setRequestProperty('Content-Length', String.valueOf(data.length));
9)設(shè)置文件類型:conn.setRequestProperty('Content-Type','application/x-www-form-urlencoded');
10)設(shè)置HTTP請(qǐng)求頭
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, */*');
設(shè)置語(yǔ)言:conn.setRequestProperty('Accept-Language“,'zh-CN');
conn.setRequestProperty('
conn.setRequestProperty('
11)以流的方式輸出.
總結(jié):
--發(fā)送POST請(qǐng)求必須設(shè)置允許輸出
--不要使用緩存,容易出現(xiàn)問(wèn)題.
--在開(kāi)始用HttpURLConnection對(duì)象的setRequestProperty()設(shè)置,就是生成HTML文件頭.
1.3.向服務(wù)器端發(fā)送xml數(shù)據(jù)(也稱為實(shí)體Entity)
XML格式是通信的標(biāo)準(zhǔn)語(yǔ)言,Android系統(tǒng)也可以通過(guò)發(fā)送XML文件傳輸數(shù)據(jù).
1)將生成的XML文件寫(xiě)入到byte數(shù)組中,并設(shè)置為UTF-8:byte[] xmlbyte = xml.toString().getBytes('UTF-8');
2)創(chuàng)建URL對(duì)象,并指定地址和參數(shù):URL url = new URL(http://localhost:8080/itcast/contanctmanage.do?method=readxml);
3)獲得鏈接:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
4)設(shè)置連接超時(shí):conn.setConnectTimeout(6* 1000);
5)設(shè)置允許輸出conn.setDoOutput(true);
6)設(shè)置不使用緩存:conn.setUseCaches(false);
7)設(shè)置以POST方式傳輸:conn.setRequestMethod('POST');
8)維持長(zhǎng)連接:conn.setRequestProperty('Connection', 'Keep-Alive');
9)設(shè)置字符集:conn.setRequestProperty('Charset', 'UTF-8');
10)設(shè)置文件的總長(zhǎng)度:conn.setRequestProperty('Content-Length', String.valueOf(xmlbyte.length));
11)設(shè)置文件類型:conn.setRequestProperty('Content-Type','text/xml; charset=UTF-8');
12)以文件流的方式發(fā)送xml數(shù)據(jù):outStream.write(xmlbyte);
總結(jié):
--我們使用的是用HTML的方式傳輸文件,這個(gè)方式只能傳輸一般在5M一下的文件.
--傳輸大文件不適合用HTML的方式,傳輸大文件我們要面向Socket編程.確保程序的穩(wěn)定性
--將地址和參數(shù)存到byte數(shù)組中:byte[] data = params.toString().getBytes();
1.4 利用Apache的HttpClient實(shí)現(xiàn)Android客戶端發(fā)送實(shí)體Entity
以上為直接利用HTTP協(xié)議來(lái)實(shí)現(xiàn)的,其實(shí)Android已經(jīng)集成了第三方開(kāi)源項(xiàng)目-------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方法進(jìn)行參數(shù)傳遞時(shí),需要使用NameValuePair來(lái)保存要傳遞的參數(shù)。另外,還需要設(shè)置所使用的字符集。
二、基于Socket通信
Socket編程比基于URL的網(wǎng)絡(luò)編程提供了更高的傳輸效率,更強(qiáng)大的功能和更靈活的控制。在Java中已經(jīng)是層次最低的網(wǎng)絡(luò)編程接口,在Java中要直接操作協(xié)議中更低的層次,那就只有使用JNI了,那基本屬于本地語(yǔ)言的范疇。
三、其它網(wǎng)絡(luò)相關(guān)技術(shù)
3.1、Android WebView控件
在android app 中嵌入網(wǎng)頁(yè)的形式。
此外,通過(guò)webview可以實(shí)現(xiàn)HTMLjavascriptAndroid Java 交互,訪問(wèn)本地手機(jī)硬件。
例如:
1) webview.addJavascriptInterface(Object obj, String interfaceName))方法, 讓Java方法可以在javascript中被調(diào)用;
voidaddJavascriptInterface(Object obj, String interfaceName)
Use this function to bind an object to JavaScript so that the methods can be accessed from JavaScript.
2)Java中調(diào)用Javascript腳本中的方法
webview.loadUrl('javascript:show(''+json+'')');//調(diào)用js的show方法
3.2基于SOAP協(xié)議與Webservice網(wǎng)絡(luò)交互 ------------KSoap2
簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)是一種輕量的、簡(jiǎn)單的、基于 XML 的協(xié)議。
通過(guò)第三方提供的架包ksoap2-Android-assembly-2.4-jar-with-dependencies.jar,我們可以向服務(wù)器進(jìn)行請(qǐng)求調(diào)用自己需要的服務(wù)。
3.3 實(shí)現(xiàn)服務(wù)器推送
通過(guò)建立持久連接的方法,服務(wù)器端發(fā)送信息給手機(jī)Android用戶。
方法一:MQTT協(xié)議(實(shí)例android+php)
1、服務(wù)器端需下載安裝IBM的 Really Small Message Broker (RSMB)(MQTT協(xié)議代理),并運(yùn)行broker;
2、PHP服務(wù)器端使用SAM 針對(duì)MQTT寫(xiě)的PHP庫(kù)(下載鏈接為T(mén)okudu PHPMQTT通信項(xiàng)目),其中send_mqtt.php是一個(gè)通過(guò)POST接收消息并且通過(guò)SAM將消息發(fā)送給RSMB的PHP腳本;
3、實(shí)例下載:
說(shuō)明:http://tokudu.com/2010/how-to-implement-push-notifications-for-android/
android客戶端:https://github.com/tokudu/AndroidPushNotificationsDemo
php服務(wù)器端:https://github.com/tokudu/PhpMQTTClient
方法二:XMPP協(xié)議(實(shí)例android+jsp)
XMPP : The Extensible Messaging and Presence Protocol (可擴(kuò)展通訊和表示協(xié)議) XMPP 以 Jabber 協(xié)議為基礎(chǔ),而 Jabber 是即時(shí)通訊中常用的開(kāi)放式協(xié)議。
解壓服務(wù)器端,點(diǎn)擊bin/run.bat運(yùn)行,訪問(wèn):http://127.0.0.1:7070/index.do,就可以看服務(wù)器端的管理頁(yè)面,用這個(gè)管理頁(yè)面,就要向客戶端push消息。
方法三:使用APNS (Android Push Notification Service)
APNS (Android Push Notification Service) 是一種在 android 上輕松實(shí)現(xiàn) push notification 的功能的解決方案. 只需申請(qǐng)一個(gè) API Key, 經(jīng)過(guò)簡(jiǎn)單的步驟即可實(shí)現(xiàn) push notification 的功能.
3.4 PhoneGap
提到移動(dòng)3G時(shí)代網(wǎng)絡(luò)應(yīng)用,不得不提一下PhoneGap了。
phonegap利用HTML,CSS,javascript, 支持Android、iPhone,Windows Phone、Palm OS、Sybian....
如果考慮開(kāi)發(fā)一款應(yīng)用,適用于大多數(shù)智能手機(jī),phonegap是可以考慮的開(kāi)發(fā)框架之一。