国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于HTTP的安卓與服務(wù)器交互方法的實(shí)現(xiàn)

2015-04-13 00:30:27馬昭征
無線互聯(lián)科技 2015年3期
關(guān)鍵詞:通信安卓

馬昭征

摘 要:文章主要實(shí)現(xiàn)了基于HTTP的安卓與服務(wù)器交互的幾種實(shí)用方法。簡(jiǎn)析安卓上傳數(shù)據(jù)和下載數(shù)據(jù)的傳輸過程以及服務(wù)器接受收據(jù)并響應(yīng)的過程。通過比較各參數(shù),以簡(jiǎn)單直接的方法實(shí)現(xiàn)上述目的。文章也附上實(shí)際案例,由安卓端的上傳和下載文字及圖片,演示了客戶端對(duì)于數(shù)據(jù)請(qǐng)求的發(fā)送、服務(wù)器對(duì)該請(qǐng)求的處理、服務(wù)器向安卓發(fā)送數(shù)據(jù)以及安卓處理服務(wù)器相應(yīng)的整個(gè)流程。驗(yàn)證了文中所介紹方法的實(shí)用性。

關(guān)鍵詞:安卓;HttpClient;通信

2014年7月,市場(chǎng)分析機(jī)構(gòu)Strategy Analytics公布了2014年第二季度智能手機(jī)操作系統(tǒng)全球分布情況。報(bào)告顯示,目前安卓操作系統(tǒng)的全球市場(chǎng)份額已達(dá)85%(有史以來最高比重),而蘋果的iOS、微軟的WindowsPhone等系統(tǒng)占比均有所下滑[1]。近年來,在谷歌努力的研發(fā)和推廣下,安卓迅速興起和發(fā)展,碎片化問題也隨著Android 4.4的發(fā)布得到了改觀。開發(fā)者們對(duì)安卓開發(fā)的熱情也隨之空前的高漲。然而除了諸如計(jì)算機(jī)、錄音機(jī)、手電筒等完全本地化的應(yīng)用,目前安卓手機(jī)上大部分應(yīng)用幾乎都要和網(wǎng)絡(luò)打交道。作為一個(gè)開發(fā)者,掌握安卓的通訊機(jī)制是十分必要的。目前而言,安卓與服務(wù)器的通訊最為普遍。這種通訊經(jīng)常采用超文本傳送協(xié)議,即HTTP(Hypertext transfer protocol)。另外也有FTP(File Transfer Protocol)、Telnet、SMTP(Simple Mail Transfer Protocol)等幾種不同的協(xié)議,但考慮到使用的廣泛性,文章僅介紹最常用的基于HTTP的通交互方式。在這當(dāng)中較為常用的訪問網(wǎng)絡(luò)方法有如下幾種:直接使用統(tǒng)一資源定位符,即URL(Uniform Resource Locator)的HttpURLConnection、Apache的HttpClient、還有就是利用WebView等等。這幾種方法各有利弊。WebView主要是用來顯示網(wǎng)頁的,而就數(shù)據(jù)的傳輸而言,前兩者使用廣泛。java.net包提供了通過HTTP訪問資源的基本功能,即HttpURLConnection。它是URLConnection的一個(gè)子類,是一個(gè)輕量級(jí)的類,它的實(shí)例可以共享連接到HTTP服務(wù)器的基礎(chǔ)網(wǎng)絡(luò)。HttpURLConnection因?yàn)檩^為輕便,因此理論上傳輸速度較快,另外其可擴(kuò)展性也較強(qiáng)。但是由于協(xié)議應(yīng)用本身的復(fù)雜性,使得在大量實(shí)際項(xiàng)目單純使用Java語言的軟件開發(fā)工具包進(jìn)行HTTP編程仍然相對(duì)比較困難。而且在Android2.2之前有一個(gè)未修復(fù)的錯(cuò)誤。針對(duì)這種情況,開源軟件組織Apach推出了HttpClient開源組件,并且提供穩(wěn)定持續(xù)的升級(jí)版本。它提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP 協(xié)議最新的版本和建議。它封裝了很多實(shí)用的方法共開發(fā)者調(diào)用,開發(fā)者無需再寫大量代碼。因此在實(shí)際項(xiàng)目中采用HttpClient組件進(jìn)行HTTP協(xié)議編程是一種高效經(jīng)濟(jì)的解決方案[2]。因此,文章介紹的與服務(wù)器交互的方法是基于HttpClient的。

1 安卓端

1.1 安卓端的上傳

首先是請(qǐng)求方式的選擇。眾所周知,HTTP的請(qǐng)求方法有GET、POST、HEAD、PUT、DELETE、TRACE和OPTIONS幾種,其中用的較為廣泛的有GET和POST兩種。相對(duì)而言,我更加推薦使用POST方法。原因是GET方法的請(qǐng)求中只包含request-line部分,它將數(shù)據(jù)直接添加在URI中,這樣的話一些重要且私密的數(shù)據(jù)就會(huì)暴露在地址欄里。而POST則可以通過添加request-body,將數(shù)據(jù)放進(jìn)body里再進(jìn)行傳送,這樣不會(huì)出現(xiàn)數(shù)據(jù)暴露的安全隱患。因此相較于GET方法,POST的傳輸數(shù)據(jù)量更大,安全性也更高。

要注意的是,使用POST方式看不到傳送的數(shù)據(jù)不是因?yàn)镻OST方式自身的處理,而是因?yàn)闉g覽器做了相應(yīng)的處理和限制,因此使數(shù)據(jù)不會(huì)被明顯暴露在瀏覽器界面上。但是只要利用一些工具還是可以查找到數(shù)據(jù)的。所以從這個(gè)角度講,GET和POST都是不安全的。但是相對(duì)而言,GET是把數(shù)據(jù)直接顯示在地址欄里,而POST則要隱秘許多。因此POST相對(duì)GET確實(shí)比較安全。

在安卓客戶端要使用HttpClient首先要?jiǎng)?chuàng)建一個(gè)它的實(shí)例。由于安卓自帶有HttpClient,所以可以直接調(diào)用系統(tǒng)應(yīng)用程序編程接口來創(chuàng)建。此后需要?jiǎng)?chuàng)建請(qǐng)求方式的實(shí)例。

HttpPost post=new HttpPost(URL);

注意,這里的URL是請(qǐng)求的地址,務(wù)必要填寫,不然的話在執(zhí)行POST方法時(shí)會(huì)報(bào)一個(gè)NullPointer的空指針錯(cuò)誤。由于文章中的服務(wù)器采用的是Struts2+Hibernate框架,因此URL的基本格式是:

http://服務(wù)器ip地址/項(xiàng)目名/action名稱.action

如果需要傳送一些數(shù)據(jù),在這里可以用剛才說到的向request-body添加數(shù)據(jù)的方式來傳送。HttpClient的結(jié)構(gòu)如圖1所示。

由圖1可以看到,我們關(guān)注的各種HTTP方法都被定義成一個(gè)個(gè)獨(dú)立的類,而他們都繼承自HttpRequestBase。其中比較特殊一點(diǎn)的是HttpPut和HttpPost,可以看出只有他們都是繼承自HttpEntityEnclosingRequestBase這個(gè)抽象類。這是因?yàn)樗鼈冃枰O(shè)置request-body,即請(qǐng)求實(shí)體。而HttpEntityEnclosingRequestBase里有HttpEntity的成員變量。HttpEntity是一個(gè)接口,程序員可以根據(jù)具體項(xiàng)目中需要傳遞的數(shù)據(jù)類型選擇ByteArrayEntity、StringEntity、InputreamEntity、FileEntity等等類。他們均實(shí)現(xiàn)了HttpEntity這個(gè)接口。除此之外HttpClient還提供了UrlEncodedFormEntity類和MultipartEntity類來滿足更多的需求。

在此,筆者介紹一種通過模擬超文本標(biāo)記語言HTML(HyperText Mark-up Language)的表單來傳送POST請(qǐng)求里參數(shù)的方法。而用到的工具則是UrlEncodedFormEntity這個(gè)類。

首先創(chuàng)建一個(gè)List的實(shí)例:

List params = new ArrayList ();

這里的NameValuePair是用于關(guān)聯(lián)某一名稱與某一值的專門類。

第二步就可以向?qū)嵗齪arams里添加需要傳送的數(shù)據(jù)了。使用的是params的add方法:add(param1, String1)。

這里有兩個(gè)參數(shù)。實(shí)際上就相當(dāng)于Map里的鍵值對(duì)的概念。而這里的第二個(gè)參數(shù)必須是字符串格式。

再將添加完數(shù)據(jù)后的List實(shí)例params加入POST的body里。如果數(shù)據(jù)中有漢字,必須設(shè)置POST的編碼格式:

post.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));

之后可以執(zhí)行請(qǐng)求并且讀取Response:

HttpResponse response = client.execute(post);

最后可用releaseConnection釋放連接。

如果需要上傳圖片、音頻等文件,也可以使用這種模擬表單的方法。可以使用剛剛提到的在HttpClient程序包中另一個(gè)類MultipartEntity。它同樣實(shí)現(xiàn)了HttpEntity接口。但由于該類使用起來并不是最方便,并且已經(jīng)介紹過表單模擬的相關(guān)方法了。是這里介紹一種更為簡(jiǎn)單的方法,即使用FileEntity類來實(shí)現(xiàn)。只需要實(shí)例化FileEntity

FileEntity entity = new FileEntity(file, "binary/octet-stream");

再同樣用setEntity方法后就可以執(zhí)行了。

1.2 安卓端的接受

上一節(jié)講到接受服務(wù)器的響應(yīng)可以實(shí)例HttpResponse來實(shí)現(xiàn):

HttpResponse response = client.execute(post);

然后可以用if語句來判斷Response的情況:

if(re.getStatusLine().getStatusCode()= =HttpStatus.SC_OK)

這里的HttpStatus.SC_OK即200,代表整個(gè)傳送順利進(jìn)行。

接下來對(duì)服務(wù)器傳遞過來的數(shù)據(jù)進(jìn)行解析。

首先要獲取承載數(shù)據(jù)的實(shí)體:

HttpEntity entity = response.getEntity();

判斷entity是否為空,如果非空則從里面獲取其實(shí)際的數(shù)據(jù)。

這里需要用到EntityUtils這個(gè)類。它是一個(gè)工具類,是為HttpEntity對(duì)象提供的靜態(tài)幫助類。利用它可以快速獲取服務(wù)器傳遞的數(shù)據(jù):

String out = EntityUtils.toString(n, "UTF-8");

如果是圖片、音頻等轉(zhuǎn)換而成的byte數(shù)組,則可以用如下方法直接得到byte數(shù)組:

byte[] by = EntityUtils.toByteArray(en);

另外,如果服務(wù)器的數(shù)據(jù)是通過JSON (JavaScript Object Notation)包裝過的,則還需將字符串out轉(zhuǎn)換為JSON對(duì)象:

JSONObject json = new JSONObject(out);

最后就可以從json實(shí)例里直接得到服務(wù)器反饋的數(shù)據(jù)了,如:

int result1 = jsonObject1.getInt("result1");

Sring result2=jsonObject1.getString("result2");

在此對(duì)JSON進(jìn)行簡(jiǎn)單介紹。

JSON是一種輕量級(jí)的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition- December 1999的一個(gè)子集。JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C,C++,C#,Java,JavaScript,Perl,Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。由于JSON的數(shù)據(jù)格式非常簡(jiǎn)單,我們可以用JSON傳輸一個(gè)簡(jiǎn)單的String、Integer、Boolean、也可以傳輸一個(gè)數(shù)組或者一個(gè)復(fù)雜的Object對(duì)象[3]。

2 服務(wù)器端

2.1 服務(wù)器的接受

服務(wù)器用的是Struts2+Hibernate框架。其中Struts框架是整個(gè)系統(tǒng)應(yīng)用框架的基礎(chǔ),它實(shí)現(xiàn)了各個(gè)模塊的低耦合,使用Hibernate框架只考慮持久層應(yīng)用。所謂的持久層就是由DAO(Data Access Object)組件構(gòu)成,簡(jiǎn)單說就是屏蔽了與數(shù)據(jù)庫打交道的細(xì)節(jié),只需調(diào)用DAO接口中的方法就可以對(duì)后臺(tái)數(shù)據(jù)操作[4]。用戶通過表示層向服務(wù)器發(fā)送應(yīng)用請(qǐng)求,Struts框架的主要功能就是攔截用戶的操作請(qǐng)求,解析用戶請(qǐng)求的對(duì)象,并把請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的Action類處理,在Action類中,調(diào)用相應(yīng)的持久層再把操作結(jié)果返回前端表示層顯示。在持久層,Hibernate主要責(zé)任就是負(fù)責(zé)實(shí)體對(duì)象與數(shù)據(jù)庫之間的交互映射,使得我們只需通過操作DAO層的實(shí)體對(duì)象就可以操作數(shù)據(jù)庫,獲得我們想要的數(shù)據(jù),再經(jīng)過業(yè)務(wù)邏輯層、表示層最終返回給表示層,展示給用戶使用。因此它接受客戶端傳來的數(shù)據(jù)十分簡(jiǎn)單。按照Struts的規(guī)則,在Action類里面寫對(duì)應(yīng)的方法即可[5]。

這里需要注意的有4點(diǎn)。

(1)在struts.xml里配置action時(shí),package里的extends一定要寫成extends="json-default"。同時(shí)result里的type要寫成type="json"。這樣就可以通過JSON來傳遞數(shù)據(jù)了。

(2)而Action類需要實(shí)現(xiàn)ServletRequestAware和ServletResponseAware這兩個(gè)接口,這樣就可以得到Request和Response的實(shí)例了。

(3)所有的Action類都要拋出IOException。

(4)Action類的成員變量要有g(shù)etter()和setter()方法[6]。

接下來只需要根據(jù)傳遞數(shù)據(jù)的格式來取數(shù)據(jù):

request.getParameter("name");

request.getInputStream;

這里的"name"是NameValuePair里Value所對(duì)應(yīng)的Name。而InputStream則適用于圖片等文件的讀取。

2.2 服務(wù)器的響應(yīng)

與接收數(shù)據(jù)一樣,也是在Action類里寫對(duì)應(yīng)的方法,再在struts.xml里配置。

要通過JSON傳遞數(shù)據(jù)先要?jiǎng)?chuàng)建JSONObject的 實(shí)例:

JSONObject jsonObject = new JSONObject();

如果是傳遞多組數(shù)據(jù),在此可以使用在JSONArray里面添加JSONObject的方法:

JSONArray jsonArray = new JSONArray();

之后向jsonObject里添加需要反饋給客戶端的數(shù)據(jù):

jsonObject.put("result", result);

這里也要注意如果數(shù)據(jù)包含中文字符,則需要設(shè)置Response的編碼格式: response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");

最后將jsonObject轉(zhuǎn)換為String,利用Response的Writer把數(shù)據(jù)發(fā)送出去:

response.getWriter().write(jsonObject.toString());

對(duì)于發(fā)送圖片,可以將服務(wù)器上待發(fā)送的文件通過文件輸出流和字節(jié)數(shù)組流轉(zhuǎn)換為字節(jié)數(shù)組。之后獲取Response的OutputStream的實(shí)例,就可以由該實(shí)例的write方法將字節(jié)數(shù)組發(fā)送出去[7]?;玖鞒炭蓞⒖家幌麓a片段:

FileInputStream fis=new FileInputStream(file);

ByteArrayOutputStream bao =

new ByteArrayOutputStream();

int data = -1;

while ((data = fis.read()) != -1) {

bao.write(data);

}

byte[] b = bao.toByteArray();

OutputStream os = response.getOutputStream();

os.write(b);

os.flush();

3 實(shí)際案例

3.1 開發(fā)環(huán)境

3.1.1 安卓端

操作系統(tǒng):MOKEE - Android 4.4.4

手機(jī)型號(hào):Sony L36H

開發(fā)環(huán)境:Eclipse Ver 4.2.0

3.1.2 PC

操作系統(tǒng):Windows 7 旗艦版 64位

3.1.3 服務(wù)器:apache-tomcat-7.0.57

集成環(huán)境:MyEclipse Ver 4.3.0

3.1.4 工程名:SSHTest

3.2 具體實(shí)施

該案例是對(duì)文章所講述的方法做一次實(shí)際的操作來進(jìn)行驗(yàn)證。因此分別實(shí)現(xiàn)文字的上傳與下載和圖片的上傳與下載四個(gè)功能。界面布局如圖2所示。

需要上傳的圖片和文字打開應(yīng)用時(shí)就直接顯示在界面上。

3.2.1 安卓端的上傳和服務(wù)器的接受

安卓端:

在進(jìn)入正題之前,有兩點(diǎn)需要注意。首先要在AndroidManifest.xml文件里添加INTERNET權(quán)限。不添加這個(gè)用戶權(quán)限,該應(yīng)用無法進(jìn)行網(wǎng)絡(luò)訪問。但這往往是最容易忘記的一步。

第二點(diǎn),在Android 4.0以上的版本,只能由主線程更改界面,而訪問網(wǎng)絡(luò)只能在子線程進(jìn)行。所以這里可以用異步類AsyncTask和Handler機(jī)制。

接下來直接進(jìn)入正題。

首先找到圖片文件的路徑,如果文件是儲(chǔ)存在SD卡里的話,還需要在AndroidManifest.xml里添加WRITE_EXTERNAL_STORAGE權(quán)限。隨后將文件添加到FileEntity里。之后創(chuàng)建HttpClient和HttpPost的實(shí)例并且執(zhí)行。

代碼:

//這里的 arg0[0]是AsyncTask傳遞進(jìn)來的第一//個(gè)URL。對(duì)應(yīng)服務(wù)器里相應(yīng)的Action

HttpPost post = new HttpPost(arg0[0]);

HttpClient client = new DefaultHttpClient();

//添加圖片

File file = new File(path);

FileEntity entity = new FileEntity(file, "binary/octet-stream");

entity.setContentEncoding("binary/octet-stream");

post.setEntity(entity);

//或者添加文字

String wordsToUpload = words.getText().toString().trim();

List params = new ArrayList ();

params.add(new BasicNameValuePair ("mystring", wordsToUpload));

post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

//執(zhí)行請(qǐng)求

HttpResponse re = client.execute(post);

服務(wù)器:

在相應(yīng)的Action方法里只需要一步就可以獲取安卓端發(fā)過來的數(shù)據(jù)了:

//獲取圖片流

InputStream is = request.getInputStream();

//獲取模擬表單數(shù)據(jù)

String string=request.getParameter("mystring");

注意,這里的"mystring"和安卓端添加數(shù)據(jù)時(shí)

params.add(new BasicNameValuePair ("mystring", wordsToUpload));

這一句里的"mystring"是相對(duì)應(yīng)的。該值由程序員自定義。

在接受完數(shù)據(jù)后,將圖片儲(chǔ)存在電腦的硬盤里,我選擇的路徑是D盤的FromAndroid文件夾。再將字符串打印到控制臺(tái)顯示出來。

如果程序順利執(zhí)行,安卓端收到HttpResponse的StatusCode將會(huì)等于200。此時(shí)執(zhí)行一個(gè)Toast提示用戶上傳成功,如圖3所示。反之,如果StatusCode不等于200,則說明執(zhí)行過程存在錯(cuò)誤。那么也執(zhí)行Toast提醒上傳失敗,請(qǐng)重新上傳!此后可以查看Eclipse的LogCat和MyEclipse的Console來確認(rèn)哪一步出錯(cuò)。

3.2.2 安卓端的下載和服務(wù)器的響應(yīng)

安卓端的請(qǐng)求:

由于下載過程中安卓端無需向服務(wù)器發(fā)送數(shù)據(jù),因此只需要簡(jiǎn)單地請(qǐng)求服務(wù)器中響應(yīng)的Action就可以了。不用再添加request-body。

服務(wù)器的響應(yīng):

當(dāng)服務(wù)器接受到安卓發(fā)出的請(qǐng)求后,與URL相對(duì)應(yīng)的Action就開始工作,如圖4所示。

代碼:

//發(fā)送圖片。圖片位于D盤內(nèi)

File file = new File("D:\\FromServer.png");

FileInputStream fis= new FileInputStream(file);

ByteArrayOutputStream bos=new ByteArrayOutputStream();

int data = -1;

while ((data = fis.read()) != -1) {

bops.write(data);

}

byte[] b = bos.toByteArray(); //最終將圖片轉(zhuǎn)換為字節(jié)數(shù)組

//得到response的輸出流并寫出

OutputStream os = response.getOutputStream();

os.write(b);

os.flush();

fis.close();

bos.close();

//發(fā)送字符組

//創(chuàng)建JSON格式的列表用戶添加多組數(shù)據(jù)

JSONArray jsonArray = new JSONArray();

JSONObject jsonObject1 = new JSONObject();

jsonObject1.put("id", 1);

jsonObject1.put("place", "陽明山");

//創(chuàng)建JSONObject對(duì)象,將數(shù)據(jù)一一填入

JSONObject jsonObject2 = new JSONObject();

jsonObject2.put("id", 2);

jsonObject2.put("place", "日月潭");

//向列表里添加各個(gè)JSONObject。它們將順序//排列

jsonArray.add(0, jsonObject1);

jsonArray.add(1, jsonObject2);

//從這里開始發(fā)送。

//設(shè)置字符編碼格式和數(shù)據(jù)/格式

response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8");

response.getWriter().write(jsonArray.toString());

安卓端的接受主要就是從HttpResponse里獲取響應(yīng)實(shí)體:

HttpEntity entity = re.getEntity();

第二部分里提到過用于接受服務(wù)器數(shù)據(jù)的幫助類EntityUtils。在這里就要使用它。

按照服務(wù)器發(fā)送的數(shù)據(jù)格式我們可以調(diào)用EntityUtils里不同方法。

對(duì)于字符串可以使用EntityUtils. toString()方法。對(duì)于字節(jié)數(shù)組可以使用EntityUtils.toByteArray()方法。

byte[] by = EntityUtils.toByteArray(entity);

String out = EntityUtils.toString(entity, "UTF-8");

隨后只需把獲取的數(shù)據(jù)裝入Message中,并用Handler發(fā)送給主線程,就可以顯示在界面上了,如圖5所示。

4 結(jié)語

文章對(duì)安卓與服務(wù)器之間交互的具體方法做了相應(yīng)的介紹。采用的通訊方式是HTTP。它采用了請(qǐng)求/響應(yīng)模型。安卓端向服務(wù)器發(fā)送的請(qǐng)求包含了:請(qǐng)求的方法、URL、協(xié)議版本和客戶信息等等。而服務(wù)器勢(shì)必要有一個(gè)反饋。如果安卓端的請(qǐng)求內(nèi)容中包括對(duì)服務(wù)器內(nèi)客戶資料、服務(wù)器文件或其他數(shù)據(jù)的請(qǐng)求,那么服務(wù)器在響應(yīng)的同時(shí)還需要將這些數(shù)據(jù)一并傳送到安卓端。因此文章就上傳和下載這兩個(gè)生活中最常見的動(dòng)作為主,分別從安卓端和服務(wù)器端介紹了它們之間通訊的具體過程。

而在具體方法的選擇中,文章是本著簡(jiǎn)單實(shí)用多樣的原則進(jìn)行介紹的。在傳輸方式上選擇了更為安全和更具傳輸量的POST方法。傳送字符串?dāng)?shù)據(jù)用的是模擬HTML表單的NameValuePair列表方式。類似鍵值對(duì)的輸入過程一目了然。需要關(guān)心的只有字符編碼的統(tǒng)一設(shè)置,規(guī)避亂碼的問題。而對(duì)于圖片的傳送則用到了繼承HttpEntity接口的FileEntity。它是專門用于傳送文件的類,只需在創(chuàng)建其實(shí)例時(shí)將文件放入,再設(shè)置文件的格式就可以方便地傳送該文件到服務(wù)器;而對(duì)于下載字符串?dāng)?shù)據(jù),則用了輕量級(jí)的數(shù)據(jù)交換格式JSON。下載圖片則是將文件轉(zhuǎn)換為字節(jié)數(shù)組再進(jìn)行傳輸。

最后的實(shí)例分析也驗(yàn)證了以上方法切實(shí)可行。希望能讓讀者對(duì)于安卓與服務(wù)器之間的通訊交互的細(xì)節(jié)有更多的實(shí)際認(rèn)識(shí)。

猜你喜歡
通信安卓
iPhone不卡的秘密曝光:安卓也能享受
MIPS安卓平臺(tái)上ARM二進(jìn)制翻譯系統(tǒng)
文物表情包
一種基于安卓系統(tǒng)的手機(jī)側(cè)抓包分析方法
基于“一級(jí)調(diào)度、兩級(jí)運(yùn)維”的通信管理體系研究①
科技資訊(2016年19期)2016-11-15 10:10:38
計(jì)算機(jī)技術(shù)在通信中的應(yīng)用
簡(jiǎn)述計(jì)算機(jī)通信網(wǎng)絡(luò)安全與防護(hù)策略
Android環(huán)境下主UI線程與子線程通信機(jī)制研究
無線自組網(wǎng)在野戰(zhàn)防空通信系統(tǒng)中的應(yīng)用
對(duì)數(shù)字微波通信技術(shù)的研究
突泉县| 龙里县| 财经| 临潭县| 新河县| 永靖县| 长沙市| 藁城市| 昭觉县| 集贤县| 四平市| 长沙县| 略阳县| 临城县| 巴林左旗| 监利县| 乌苏市| 车致| 略阳县| 台中市| 杭锦后旗| 德安县| 繁峙县| 阿拉尔市| 广安市| 嘉善县| 鄱阳县| 即墨市| 玉龙| 华容县| 高平市| 双牌县| 河津市| 阳信县| 佛教| 漳平市| 麻阳| 额尔古纳市| 封丘县| 南乐县| 利辛县|