王明松 羅清隆 馬昊
摘要:Android智能手機作為當今流行的移動互聯(lián)網(wǎng)客戶端,已廣泛應用于各種生產(chǎn)生活領域內(nèi),對信息數(shù)據(jù)的快速傳播與知識交流起了極大的促進作用。移動互聯(lián)網(wǎng)的廣泛普及與應用,帶來了手機客戶端與應用服務之間連接與傳輸數(shù)據(jù)的問題。該文提出了兩種數(shù)據(jù)交換方式,提高了數(shù)據(jù)傳輸與應用效率。服務器采用Servlet接口處理,可以快速高效的進行數(shù)據(jù)處理。XML數(shù)據(jù)格式具備規(guī)范性和高識別效應,可以在小容量多種類的數(shù)據(jù)傳輸中使用。JSON數(shù)據(jù)格式由于具有文本特性,能夠更好處理大容量數(shù)據(jù)傳輸。
關鍵詞:Android通信;Android應用開發(fā);Servlet通信
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2019)04-0054-02
1 手機客戶端與應用服務器的請求響應過程
近年來,隨著移動互聯(lián)網(wǎng)在社會經(jīng)濟中的廣泛應用,智能手機作為實用方便的客戶端移動設備,已成為移動網(wǎng)絡應用最重要的網(wǎng)絡連接設備。Android作為智能手機的操作系統(tǒng),被眾多手機生產(chǎn)商所接受,同時基于它的應用軟件幾乎包涵了社會生活的各個領域,已成為當今影響力最強的操作系統(tǒng)之一。
在與Android客戶端進行交互數(shù)據(jù)的應用服務器處理上,Java Servlet是運行在Web服務器或應用服務器上的程序,作為來自客戶端請求和應用程序之間的連接層。使用 Servlet,可以收集來自網(wǎng)頁表單和其他客戶端的用戶數(shù)據(jù),呈現(xiàn)來自數(shù)據(jù)庫或者其他源的記錄,并可以向客戶端返回執(zhí)行后的數(shù)據(jù)。
在與Android客戶端進行交互數(shù)據(jù)的應用服務器處理上,Java Servlet是運行在Web服務器或應用服務器上的程序,作為來自Web瀏覽器或其他HTTP客戶端請求和HTTP服務器上的數(shù)據(jù)庫或應用程序之間的中間層。使用 Servlet,可以收集來自網(wǎng)頁表單和其他客戶端的用戶數(shù)據(jù),呈現(xiàn)來自數(shù)據(jù)庫或者其他源的記錄,并可以向客戶端返回執(zhí)行后的數(shù)據(jù)。Java Servlet具有以下優(yōu)勢:
(1)Servlet在Web服務器的地址空間內(nèi)執(zhí)行。不必再創(chuàng)建一個單獨的進程來處理每個客戶端請求,提高了應用服務的效率和執(zhí)行速度。
(2)Servlet獨立于平臺操作,可以實現(xiàn)跨平臺使用。
(3)Servlet是安全可信任的。服務器上的Java安全管理器執(zhí)行了一系列限制,以保護服務器計算機上的資源。
(4)Java類庫的全部功能對 Servlet 來說都是可用的。可以通過sockets和RMI機制與applets、數(shù)據(jù)庫或其他軟件進行交互。
Servlet執(zhí)行過程一般包括:
(1)讀取客戶端(瀏覽器或手機)發(fā)送的顯式的數(shù)據(jù)。
(2)讀取客戶端(瀏覽器)發(fā)送的隱式的 HTTP 請求數(shù)據(jù)。這包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等。
(3)處理數(shù)據(jù)并生成結果。這個過程可能需要訪問數(shù)據(jù)庫,執(zhí)行RMI或CORBA調用,調用Web服務,或者直接計算得出對應的響應。
(4)發(fā)送顯式的數(shù)據(jù)(即文檔)到客戶端(瀏覽器或手機)。該文檔的格式可以是多種多樣的,包括文本文件(HTML 或 XML)、二進制文件(GIF 圖像)、Excel 等。
(5)發(fā)送隱式的HTTP響應到客戶端(瀏覽器或手機)。這包括指出瀏覽器或其他客戶端被返回的文檔類型(例如 HTML),設置 cookies 和緩存參數(shù),以及其他類似的任務。
2 應用服務器響應XML格式數(shù)據(jù)的處理過程
手機客戶端連接Web服務器,向Servlet服務發(fā)出請求數(shù)據(jù),然后接收服務響應后的XML格式數(shù)據(jù),并進行數(shù)據(jù)解析。主要代碼如下:
(1)手機客戶端向服務器發(fā)出數(shù)據(jù),并接收返回的XML數(shù)據(jù),進行處理。
//客戶端向服務器發(fā)送請求
String urlString = 服務器地址+應用程序名 + "ClassInfoServlet?action=操作類型";
URL url = new URL(urlString);
//接收服務器處理后的XML數(shù)據(jù)
......
XMLReaderxr = 轉換對象.getXMLReader();
XML文件處理類XML處理對象 = new XML文件處理類();
xr.setContentHandler(XML文件處理對象);
//獲取數(shù)據(jù)并轉換成XML文件
......
xr.parse(is);
Return classInfoListHander.獲取數(shù)據(jù)方法();
其中XML文件處理類。其內(nèi)容如下:
public class XML文件處理類 extends DefaultHandler {
//處理XML文件數(shù)據(jù)值
public void characters(char[] ch, int start, int length) throws SAXException {
//處理過程
}
//處理XML結束標簽
public void endElement(String uri, String localName, String qName) throws SAXException {
//處理過程
}
//處理XML開始文檔
public void startDocument() throws SAXException {
classInfoList = new ArrayList
}
//處理XML結束標簽
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
//處理過程
}
}
(2)Servlet服務接收客戶端的請求,并進行數(shù)據(jù)處理。
void doPost( ) throws ServletException, IOException{
/*獲取action參數(shù),根據(jù)action的值執(zhí)行不同的業(yè)務處理*/
String action = request.getParameter("action");
if(action.equals(請求類型)) {
/* 獲取請求參數(shù),并執(zhí)行具體的業(yè)務處理操作 */
......
//向客戶端返回XML數(shù)據(jù)
StringBuffer sb = new StringBuffer();
//建立返回數(shù)據(jù)的XML文檔
sb.append(開始標簽).append("\r\n")
.append(子項開始標簽)
.append(子項數(shù)據(jù))
.append(子項結束標簽).append("\r\n")
.append(子項開始標簽)
.append(子項數(shù)據(jù))
.append(子項結束標簽).append("\r\n")
......
sb.append(結束標簽).append("\r\n");
PrintWriter out = response.getWriter();
out.print(sb.toString());
}
服務器的Servlet向Android客戶端返回XML格式數(shù)據(jù)
3 應用服務器響應JSON格式數(shù)據(jù)的處理過程
手機客戶端連接Web服務器,向Servlet服務發(fā)出請求數(shù)據(jù),然后接收服務響應后的JSON格式數(shù)據(jù),并進行數(shù)據(jù)解析,主要代碼如下:
(1)手機客戶端向服務器發(fā)生請求數(shù)據(jù),并接收返回的JSON格式數(shù)據(jù),進行處理:
String urlString = 服務器地址+應用程序名 + "ClassInfoServlet?action=操作類型";
urlString += "&參數(shù)屬性=" + URLEncoder.encode(參數(shù)值, "UTF-8") + "";
urlString += "&參數(shù)屬性=" + URLEncoder.encode(參數(shù)值, "UTF-8") + "";
//連接服務器并且發(fā)送請求數(shù)據(jù)
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
OutputStreamoutStream = conn.getOutputStream();
outStream.write(entitydata);
outStream.flush();
outStream.close();
//接收服務器的請求響應,并解析服務器傳回的JSON數(shù)據(jù)
if (conn.getResponseCode() == 200) {
byte[] resultByte= readStream(conn.getInputStream());
String result = new String(resultByte, "UTF-8");
JSONArray array = new JSONArray(result);
int length = array.length();
for (int i = 0; i< length; i++) {
JSONObject object = array.getJSONObject(i);
//處理數(shù)據(jù)
}
}
4 結語
Android智能手機作為當今流行的移動互聯(lián)網(wǎng)客戶端,已廣泛應用于各種生產(chǎn)生活領域內(nèi),對信息數(shù)據(jù)的快速傳播與知識交流起了極大的促進作用。但是作為一種嵌入式設備,智能手機的處理速度和使用容量有限,當處理數(shù)據(jù)量大時,必將數(shù)據(jù)上傳到企業(yè)服務器處理。因此在客戶端與服務器之間的數(shù)據(jù)交互尤為重要,成為提高整體系統(tǒng)使用率的重要環(huán)節(jié)。本文提出了XML數(shù)據(jù)和JSON數(shù)據(jù)兩種交換格式,適合不同的應用領域,使用數(shù)據(jù)在網(wǎng)絡的傳輸更為便捷流暢。
參考文獻:
[1] MEIERR.Android4高級編程[M].北京:清華大學出版社,2013.
[2] 陳法海,楊斌.Android系統(tǒng)中Wi-Fi網(wǎng)絡的研究與實現(xiàn)[J].成都信息工程學院學報,2010,25(5).
[3] 陳益強.簡析Android系統(tǒng)的安全性能[J].信息系統(tǒng)工程,2011(9).
[4] 李寧.Android開發(fā)權威指南[M].北京:人民郵電出版社,2013:10-11.
[5] 曾建平.Android系統(tǒng)架構及應用程序開發(fā)研究[J].微計算機信息,2011,27(9).
【通聯(lián)編輯:代影】