Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android產品研發(九)--)App網絡傳輸協議

android產品研發(九)--)App網絡傳輸協議

編輯:關於Android編程

上一篇文章中我們講解了App的數據統計,其主要分為兩種:使用第三方服務統計和自身實現數據統計。一般而言我們使用第三方統計服務已經可以很好的滿足我們的也無需求了,只是部分數據敏感性App,可能自身實現數據統計服務是一個更好的選擇。

而本文中將要介紹的是App端的網絡傳輸協議。那麼這裡首先需要明確一點的是什麼是網絡傳輸協議呢?這裡首先套用一段百度百科的定義:

網絡傳輸協議或簡稱為傳送協議(Communications Protocol[1] ),是指計算機通信的共同語言。現在最普及的計算機通信為網絡通信,所以“傳送協議”一般都指計算機通信的傳送協議,如TCP/IP、NetBEUI等。然而,傳送協議也存在於計算機的其他形式通信,例如,面向對象編程裡面對象之間的通信;操作系統內不同程序之間的消息,都需要有一個傳送協議,以確保傳信雙方能夠溝通無間。

簡單而言就是App端與服務器端交互的時候約定好的內容格式。比如我們常見的Json格式,xml格式等,這些都是網絡傳輸協議,而現在在App開發中比較常見的網絡傳輸協議有三種:xml,json,protobuf

而我們下面將分別分析其各自的使用利弊以及解析方案。

- 網絡傳輸協議-XML

xml是一種最早的網絡傳輸協議,常見於java web開發中,不單單作為網絡層的參數協議,還常見於各種配置文件中,在移動開發中也常見但是已不是主流的網絡傳輸協議。

優點:可讀性強,解析方便;

缺點:效率不高,資源消耗過大;

解析方式:DOM解析,SAX解析,PULL解析;

(1)DOM解析:

解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便於操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU)

(2)SAX解析:

SAX ,事件驅動型解析方式。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,占用資源少;SAX解析器代碼比DOM解析器代碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒保存數據,那麼數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬於哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少;

(3)PULL解析:

PULL解析方式是android專門為移動設備上解析XML文件而設計的一種解析方式,顯而易見的其更加適用於移動設備解析xml文件。Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml文件後觸發相應的事件調用方法返回的是數字還有pull可以在程序中控制想解析到哪裡就可以停止解析。

- 網絡傳輸協議-JSON

JSON是在移動端比較常見的網絡傳輸協議,它較xml格式更叫的簡單和“小”,因此比xml更適合移動端對流量和內存的控制。

優點:較XML格式更加小巧;

缺點:傳輸效率也不是太別高,但相較於xml提高了很多;

解析方式:Gson解析,JSONObject方式解析,FastJson解析

(1)Gson解析:

Gson解析方式是Google開源的一套解析方式,通過提供的Gson jar包,通過靜態方法直接由字符串解析成java對象,簡單方便。

(2)JSONObject解析:

JSONObject在org.json下面的包中,其也是一個解析Json字符串的工具類。

(3)FastJson解析:

FastJson是阿裡巴巴開源的一個解析Json數據的類庫,能夠將json字符串解析成java對象。這裡有其介紹,英文水平不好就不獻丑了…

Provide best performance in server side and android client.

Provide simple toJSONString() and parseObject() methods to convert Java objects to JSON and vice-versa

Allow pre-existing unmodifiable objects to be converted to and from JSON

Extensive support of Java Generics

Allow custom representations for objects

Support arbitrarily complex objects (with deep inheritance hierarchies and extensive use of generic types)

- 網絡傳輸協議-ProtoBuf

ProtoBuf是Google開源的一套二進制流網絡傳輸協議,它獨立於語言,獨立於平台。google 提供了多種語言的實現:java、c#、c++、go 和 python,每一種實現都包含了相應語言的編譯器以及庫文件。由於它是一種二進制的格式,比使用 xml 進行數據交換快許多。可以把它用於分布式應用之間的數據通信或者異構環境下的數據交換。作為一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用於諸如網絡傳輸、配置文件、數據存儲等諸多領域。

優點:傳輸效率快(比xml和json快10-20倍),文檔型協議;

缺點:使用不太方便;

這裡簡單解釋一下什麼是文檔型協議,向我們的xml和json一般在使用的時候都需要保存一份說明文檔和一個實際的java類,而protobuf在使用的時候其定義的格式就是說明文檔,簡單明了而且可以將其編譯成各個平台的類庫,以java平台為例,其編程成jar之後,若定義文件發生了變化,則在使用jar包的話就會報錯,必須重新編譯,這也就保證了App端與服務器端的協議統一性。

網絡傳輸協議實踐

由於ProtoBuf的傳輸效率和文檔型協議的特性,公司產品選擇了Protobuf作為網絡傳輸協議。下面我就以一個簡單的登錄操作,介紹一下對ProtoBuf的實際應用。

(1)定義ProtoBuf文件

 

這裡寫圖片描述

 

(2)定義登錄網絡操作請求接口

// 提交短信驗證碼,如果該手機號碼沒有注冊過,則直接給用戶注冊

message SmsLogin {

message Request {

required string phone = 1; // 手機號碼

required string verifyCode = 2; // 驗證碼

}

message Response {

/*

* 0:成功;-1:登錄失敗;-2:驗證碼錯誤;-3:驗證碼已經失效;-4:手機號碼格式不正確;-5:不是內測用戶不能登錄

*/

required int32 ret = 1;

optional com.uu.facade.passport.pb.bean.UserAppSessionTicket sessionTicket = 2;

optional string phone = 3; // 手機號碼

optional string imgUrl = 4; // 用戶圖像url

optional com.uu.facade.base.common.UserStatus userStatus = 5; // 用戶狀態

}

}

可以看到在Protobuf中定義網絡請求,分為兩個部分,請求部分和應答部分,其message request定義的是請求信息,而message response定義的是應答信息。請求或者應答信息中的字段就是我們請求中需要傳遞的字段。

每個字段都有修飾符,這裡的required表示的是這個字段必須要傳遞而optional表示的是這個字段可傳可不傳。並且message中可以嵌套另外的message信息,比如應答信息中的UserStatus。

(3)將proto文件編譯成jar包

這裡就不在具體介紹怎麼講proto文件編譯成jar了,google已經提供了相應的編譯工具。

(4)在android代碼中使用

由於我們將proto文件編譯成了jar包,首先我們需要將jar引入到我們的工程,然後就可以使用了。這裡簡單看一下具體的使用代碼。

<code class="hljs java">/**
     * 請求服務器短信登陸
     *
     * @param phone
     * @param code
     */
    private void requestSmsLogin(String phone, String code) {
        showProgress(false);// 顯示進度條
        LoginInterface.SmsLogin.Request.Builder request = LoginInterface.SmsLogin.Request.newBuilder();
        request.setPhone(phone); // 設置手機號
        request.setVerifyCode(code); // 設置驗證碼
        NetworkTask task = new NetworkTask(Cmd.CmdCode.SmsLogin_SSL_VALUE);
        task.setBusiData(request.build().toByteArray());
        NetworkUtils.executeNetwork(task, new HttpResponse.NetWorkResponse<uuresponsedata>() {
            @Override
            public void onSuccessResponse(UUResponseData responseData) {
                if (responseData.getRet() == 0) {
                    try {
                        // 顯示通用下發消息
                        showResponseCommonMsg(responseData.getResponseCommonMsg());
                        // 解析請求應答信息
                        LoginInterface.SmsLogin.Response response = LoginInterface.SmsLogin.Response.parseFrom(responseData.getBusiData());
                        // 判斷是否請求成功
                        if (response.getRet() == 0) {
                            ...doSomeThing()...
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        showDefaultNetworkSnackBar();
                    }
                }
            }
 
            @Override
            public void onError(VolleyError errorResponse) {
                showDefaultNetworkSnackBar();
            }
 
            @Override
            public void networkFinish() {
                // 取消進度條顯示
                dismissProgress();
            }
        });
    }</uuresponsedata></code>

可以發現我們在代碼中直接有對應的登錄請求message類,這樣我們就可以直接通過java類調用了,O(∩_∩)O哈哈~。

總結:

xml,json,protobuf三種不同的網絡傳輸協議各有利弊,大家在選擇的時候可以根據具體的產品需求來確定到底選擇哪一個,當然了這裡我還是比較推薦protobuf的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved