Android 的網絡通訊的小知識

網絡通訊機制

網絡由下往上分爲:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。IP協議對應於網絡層,TCP協議對應於傳輸層,而HTTP協議對應於應用層,三者從本質上來講沒有可比性,socket則是對TCP/IP協議的封裝和應用。也能夠說,TCP/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。java

TCP/IP協議

網絡編程的目的就是直接或間接地經過網絡協議與其餘計算機進行通信。mysql

網絡編程中有兩個主要的問題,一個是如何準確的定位網絡上一臺或多臺主機;另外一個就是找到主機後如何可靠高效的進行數據傳輸。目前使用最普遍的因特網協議是TCP/IP協議。在TCP/IP協議中IP層主要負責網絡主機的定位,數據傳輸的路由,由IP地址能夠惟一地肯定Internet上的一臺主機。而TCP層則提供面向應用的可靠的或非可靠的數據傳輸機制,這是網絡編程的主要對象,通常不須要關心IP層是如何處理數據的。android

Socket

咱們知道兩個進程若是須要進行通信最基本的一個前提能可以惟一的標示一個進程,在本地進程通信中咱們可使用PID來惟一標示一個進程,但PID只在本地惟一,網絡中的兩個進程PID衝突概率很大,這時候咱們須要另闢它徑了,咱們知道IP層的ip地址能夠惟一標示主機,而TCP層協議和端口號能夠惟一標示主機的一個進程,這樣咱們能夠利用ip地址+協議+端口號惟一標示網絡中的一個進程。可以惟一標示網絡中的進程後,它們就能夠利用socket進行通訊了,什麼是socket呢?咱們常常把socket翻譯爲套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操做抽象爲幾個簡單的接口供應用層調用已實現進程在網絡中通訊。Socket跟TCP/IP協議沒有必然的聯繫。Socket編程接口在設計的時候,就但願也能適應其餘的網絡協議。因此說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,git

Http協議

HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網經常使用的協議之一,HTTP協議是創建在TCP協議之上的一種應用。HTTP鏈接最顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後,會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」。HTTP提供了封裝或者顯示數據的具體形式。Socket提供了網絡通訊的能力。程序員

Https協議

HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL代表它使用了HTTP,但HTTPS存在不一樣於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。被普遍用於萬維網上安全敏感的通信,例如交易支付方面。github

Android網絡權限

<uses-permission android:name="android.permission.INTERNET" /><-- 容許應用程序打開網絡套接字 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><-- 容許應用程序訪問網絡鏈接信息 -->

選擇一個HTTP Client

大多數鏈接網絡的 Android app 會使用 HTTP 來發送與接收數據。Android 提供了三種 HTTP client:HttpURLConnection、Apache HttpClient和okhttp。兩者均支持 HTTPS、流媒體上傳和下載、可配置的超時、IPv6 與鏈接池(connection pooling)。ajax

  • Java.NET包中的HttpURLConnection類sql

  • HttpUrlConnection是JDK裏提供的聯網API,咱們知道Android SDK是基於Java的,因此固然優先考慮HttpUrlConnection這種最原始最基本的API,其實大多數開源的聯網框架基本上也是基於JDK的HttpUrlConnection進行的封裝罷了數據庫

  • HttpClientapache

    HttpClient是開源組織Apache提供的Java請求網絡框架,其最先是爲了方便Java服務器開發而誕生的,是對JDK中的HttpUrlConnection各API進行了封裝和簡化,提升了性能而且下降了調用API的繁瑣,Android所以也引進了這個聯網框架,咱們再不須要導入任何jar或者類庫就能夠直接使用,值得注意的是Android官方已經宣佈不建議使用HttpClient了,在Api22中棄用了它,如今應該沒有了。

  • okhttp

    http是如今主流應用使用的網絡請求方式, 用來交換數據和內容, 有效的使用HTTP可使你的APP變的更快和減小流量的使用。

    OkHttp是一個很棒HTTP客戶端:

    • 支持SPDY,能夠合併多個到同一個主機的請求

    • 使用鏈接池技術減小請求的延遲(若是SPDY是可用的話)

    • 使用GZIP壓縮減小傳輸的數據量

    • 緩存響應避免重複的網絡請求

    當你的網絡出現擁擠的時候,就是OKHttp大顯身手的時候,它能夠避免常見的網絡問題,若是你的服務是部署在不一樣的IP上面的,若是第一個鏈接失敗,OkHTtp會嘗試其餘的鏈接。這對如今IPv4+IPv6中常見的把服務冗餘部署在不一樣的數據中心上也是頗有必要的。OkHttp將使用如今TLS特性(SNI ALPN)來初始化新的鏈接,若是握手失敗,將切換到TLS 1.0。使用OkHttp很容易,同時支持異步阻塞請求和回調。若是你使用OkHttp ,你不用重寫你的代碼, okhttp-urlconnection模塊實現了 java.net.HttpURLConnection 中的API, okhttp-apache模塊實現了HttpClient中的API,可是最好使用OkhttpUtils(是okhttp進行封裝的),網絡請求更簡單,方便。

還有不少三方的網絡請求框架

1.volley

Volley 的中文翻譯爲「齊射、併發」,是在 2013 年的 Google 大會上發佈的一款 Android 平臺網絡通訊庫,具備網絡請求的處理、小圖片的異步加載和緩存等功能,可以幫助 Android APP 更方便地執行網絡操做,並且更快速高效。

優勢: 
(1)自動調度網絡請求; 
(2)高併發網絡鏈接; 
(3)經過標準的 HTTP cache coherence(高速緩存一致性)緩存磁盤和內存透明的響應; 
(4)支持指定請求的優先級( 請求隊列的優先級排序); 
(5) 提供多樣的取消機制:網絡請求 cancel 機制,咱們能夠取消單個請求,或者指定取消請求隊列中的             一個區域; 
(6)框架容易被定製,例如,定製重試或者回退功能; 
(7)包含了調試與追蹤工具; 
(8)默認 Android2.3 及以上基於 HttpURLConnection,2.3 如下使用基於 HttpClient 
(9)提供簡便的圖片加載工具(其實圖片的加載纔是咱們最爲看重的功能)

缺點: 
(1)不能下載文件:這也是它最致命的地方

官網或相關地址: 
  Volley 的 github 地址:https://github.com/mcxiaoke/android-volley; 
 Google I/O 2013 – Volley: Easy, Fast Networking for Android:                                                    https://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 
 簡單的使用:http://www.dengzhr.com/others/mobile/android/762

2.Android-async-http

Android-async-http 是一個強大的網絡請求庫,這個網絡請求庫是基於 Apache HttpClient 庫之上的一個異步網絡請求處理庫,網絡處理均基於 Android 的非 UI 線程,經過回調方法處理請求結果。 
android-async-http 是一個強大的第三方開源網絡請求庫。惋惜的是 Android 6.0 (api 23) SDK,再也不提供 org.apache.http.* (只保留幾個類)。

優勢: 
(1) 在匿名回調中處理請求結果 
(2) 在 UI 線程外進行 http 請求 
(3) 文件斷點上傳 
(4) 智能重試 
(5) 默認 gzip 壓縮 
(6) 支持解析成 Json 格式 
(7) 可將 Cookies 持久化到 SharedPreference

官網或相關地址: 
Android-async-http 的 github 地址:https://github.com/loopj/android-async-http 
官網教程:http://loopj.com/android-async-http/

接下來咱們來看下咱們國人封裝的兩個框架 Afinal 框架和 xUtils ,這兩個框架的功能很是的豐富,甚至提供了數據庫的封裝,這很符合咱們國人開發的App,都是把一大堆的功能都集進去,那這麼強大的網絡框架是否是真的那麼強大呢?一般咱們都會這樣想:功能越豐富的開源框架,那麼它在單一的功能上,好比就網絡框架這一部分,是否是就沒有其餘專注網絡的框架好呢?

注:這個框架的做者已經中止更新了,所以如今就不推薦使用了

3.Afinal框架

Afinal 是一個 android 的 sqlite orm 和 ioc 框架。同時封裝了android中的http框架,使其更加簡單易用;使用 finalBitmap,無需考慮 bitmap 在 android 中加載的時候 oom 的問題和快速滑動的時候圖片加載位置錯位等問題。

Afinal的宗旨是簡潔,快速。約定大於配置的方式。儘可能一行代碼完成全部事情。

Afinal主要是分四個模塊: 
(1) 數據庫模塊:android 中的 orm 框架,使用了線程池對 sqlite 進行操做。 
(2) 註解模塊:android 中的 ioc 框架,徹底註解方式就能夠進行UI綁定和事件綁定。無需 findViewById 和 setClickListener 等。其實它後面是使用反射來進行初始化的。 
(3) 網絡模塊:經過 httpclient 進行封裝 http 數據請求,支持 ajax方式加載,支持下載、上傳文件功能。 
(4) 圖片緩存模塊:經過 FinalBitmap,imageview 加載 bitmap 的時候無需考慮 bitmap 加載過程當中出現的 oom 和 android 容器快速滑動時候出現的圖片錯位等現象。

官網或相關地址: 
Afinal框架 的 github 地址:https://github.com/yangfuhai/afinal

注:這個框架的做者已經中止更新了,所以如今就不推薦使用了

4.xUtils

xUtils跟Afinal是同類型的框架, 如今做者已經兩三年前就沒有進行更新了。

官網的簡介: 
xUtils3 api 變化較多, 已轉至 https://github.com/wyouflf/xUtils3 
xUtils 2.x 對 Android 6.0兼容不是很好, 請儘快升級至 xUtils3. 
xUtils 包含了不少實用的android工具。 
xUtils 支持大文件上傳,更全面的http請求協議支持(10種謂詞),擁有更加靈活的 ORM,更多的事件註解支持且不受混淆影響… 
xUitls 最低兼容android 2.2 (api level 8)

官網或相關地址: 
Afinal框架 的 github 地址:https://github.com/wyouflf/xUtils

注:這個框架的做者已經中止更新了,所以如今就不推薦使用了

上面網絡框架其實就我的而已,就不推薦使用了,要不就是功能太過豐富,若是在主流的 app 中使用,對後期的維護, 代價就很大了。好比你發現你框架中不適合使用某個功能,須要替換這部分的框架,你就會發現,你整個項目都不出現這個框架的影子,對於後期維護的成本實在是太大了!

後面的幾個網路框架(okhttp , retrofit)是目前較好的網絡框架,在公司也發現,不少項目都是使用這幾個網絡框架的。這兩個網絡開源框架都是 square 公司提供的,在開源界中,有兩家公司提供的網絡框架是很是豐富的,一個是 square 和 Facebook ,真心感謝這兩個公司。

5.OKHttp

OkHttp 是一個相對成熟的解決方案,聽說 Android4.4 的源碼中能夠看到 HttpURLConnection 已經替換成 OkHttp 實現了。在 Android 6.0 中底層的源碼已經使用了 OKHttp ,這個是能夠肯定的。

OkHttp 處理了不少網絡疑難雜症:會從不少經常使用的鏈接問題中自動恢復。若是您的服務器配置了多個IP地址,當第一個 IP 鏈接失敗的時候,OkHttp 會自動嘗試下一個 IP。OkHttp 還處理了代理服務器問題和 SSL握手失敗問題。

使用 OkHttp 無需重寫您程序中的網絡代碼。OkHttp 實現了幾乎和Java.NET.HttpURLConnection 同樣的API。若是你用了 Apache HttpClient,則 OkHttp 也提供了一個對應的 okhttp-apache 模塊。

官網或相關地址: 
OKHttp 的 github 地址:https://github.com/square/okhttp

6.retrofit

其實 retrofit 是根據 OKHttp 封裝的框架,它的底層網絡請求就是使用OKHttp的,這個框架的做者也是很是有名的,就是 Jake Wharton 。簡直就是個人偶像啊!

優勢: 
(1)支持 okhttp 
(2)註解處理,簡化代碼 
(3)支持上傳和下載文件 
(4)支持本身更換解析方式 
(5)支持多種http請求庫

官網或相關地址: 
OKHttp 的 github 地址:https://github.com/square/retrofit

2、選擇開源框架的看法

1.學習的成本:對該框架學習的時間長短,文檔是否齊全的考慮  2.流行的程度:該開源框架是否流行,github 上 start 的個數,都是咱們考量的標準  3.是否還在維護:若是該框架沒人維護了,隨着技術的不斷更新,都會出現大大小小的問題的  4.代碼的體積: 體積固然不能太大了  5.代碼的設計: 總體框架的設計

相關文章
相關標籤/搜索