網(wǎng)絡框架解析與應用

網(wǎng)絡框架解析與應用

第一章

網(wǎng)絡框架完全解析與應用

第二章 網(wǎng)絡框架出現(xiàn)背景及優(yōu)勢

http出現(xiàn)及發(fā)展

  • 1960年由美國人Ted Nelson提出想法
  • 由萬維網(wǎng)協(xié)會(WWW)和互聯(lián)網(wǎng)工程工作共同研究
  • 目前使用最廣泛的是HTTP1.1
  • 如圖所示
http1.1.png

HTTP協(xié)議結構

  • 請求頭
    • 表明本次請求的客戶端
    • 本次請求所使用的cookie
    • 本次請求希望返回類型
    • 本次請求是否采用數(shù)據(jù)壓縮等等一系列設置
    • 還可以自定義請求頭
  • 請求體
    • 指定本次請求所使用的方法
    • 主要用來攜帶本次請求的參數(shù)
  • 響應頭
    • 服務器標識
    • 狀態(tài)碼
    • 內(nèi)容編碼
    • cookie返回給客戶端的cookie等等
  • 響應體
    • 主要就是我們的本次請求所返回的數(shù)據(jù)
  • 工作流程
    • 首先客戶機與服務器需要建立連接
    • 建立連接后,客戶機發(fā)送一個請求給服務器
    • 服務器接到請求后,給予相應的相應信息
    • 客戶端接收服務器所返回的信息,連接斷開
  • HTTP優(yōu)勢
    • 簡單,快速
    • 靈活
    • 無連接
    • 無狀態(tài)
  • SPDY介紹(google)
    • SPDY是一種HTTP的兼容協(xié)議

    • 多路復用請求

    • 對請求劃分優(yōu)先級

      可優(yōu)先返回文字,多媒體內(nèi)容后返回

    • 壓縮HTTP頭

  • HTTP2.0
    • 基于SPDY,IETF定制的新一代HTTP協(xié)議
    • 更安全的SSL
  • okhttp
  • okhttp優(yōu)勢
    • 支持SPDY,HTTP2.0,共享同一個Socket來處理同一個服務器的所有請求
    • 如果SPDY不可用,則通過連接池來減少請求延時
    • 無縫的支持GZIP來減少數(shù)據(jù)流量
    • 緩存響應數(shù)據(jù)來減少重復的網(wǎng)絡請求
    • 可以從很多的常用鏈接問題中自動恢復
    • 使用起來非常簡單

第三章 網(wǎng)絡框架源碼結構分析

網(wǎng)絡框架源碼結構

  • okhttp核心框架
    • 總體設計
      如圖所示:


      http框架.png
    • 流程圖
      如圖所示:


      okhttp流程圖.png
    • 核心類圖
      如圖所示:


      okhttp核心類圖.jpg
    • 多路復用機制
      如圖所示:


      okhttp多路復用.jpg
    • 重連機制
      如圖所示:


      okhttp重連.jpg
  • okhttp核心類(粗體為核心流程)
    • Route
      路由類:用來分發(fā)請求
    • ResponseBody
      響應實體類:存放返回的數(shù)據(jù),在byte()方法中是最原始的字節(jié)數(shù)據(jù)
    • Response
      構建者模式的響應類
      • Headers headers
        所有的響應頭
      • ResponseBody body
        響應體
    • RequestBody
      請求類體類
      • FormBody
        請求頭
      • MultipartBody
        文件上傳等
    • Request
      構建者模式的請求類
    • Call(Interface)
      請求任務
      HttpEngine engine
    • RealCall(Runnable) Call的實現(xiàn)類
      真正執(zhí)行響應處理
      Callback callback
    • HttpUrl
      Url的工具類
    • Headers
      請求頭
    • Dns
      解析域名
    • ConnectionPool
      連接池
    • CallBack
      回調(diào)
    • Cache、ChchePoll
      緩存模塊
    • HttpEngine
      真正發(fā)送請求的類
      • sendRequest 發(fā)送請求
      • recover重連
    • Dispatcher
      分發(fā)
      • executed(RealCall call)
    • HttpClient
      • Dispatcher dispatcher

網(wǎng)絡框架簡單使用

  • 簡單實現(xiàn)get、post請求
    • // gradle引用

        compile 'com.squareup.okhttp3:okhttp:3.4.2'
      
    • activity_main.xml

            <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/activity_main"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                tools:context="com.thssh.okhttpstudy.MainActivity">
            
                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
            
                    <TextView
                        android:id="@+id/tv_content"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Hello World!" />
                </ScrollView>
            
                <Button
                    android:id="@+id/btn_post"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:clickable="true"
                    android:text="post" />
            
                <Button
                    android:id="@+id/btn_get"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_above="@+id/btn_post"
                    android:layout_alignParentRight="true"
                    android:layout_marginBottom="10dp"
                    android:clickable="true"
                    android:text="get" />
            
            </RelativeLayout>
      
    • MainActivity.java

            public class MainActivity extends AppCompatActivity {
            
                @Bind(R.id.btn_get)Button btnGet;
                @Bind(R.id.btn_post)Button btnPost;
                @Bind(R.id.tv_content)TextView tvContent;
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    ButterKnife.bind(this);
                }
            
                @OnClick(R.id.btn_get)
                public void getRequest(){
                    Request request = new Request.Builder()
                            .url("http://www.baidu.com").build();
                    OkHttpClient client = new OkHttpClient();
                    Call call = client.newCall(request);
                    call.enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            setText(e.getMessage());
                        }
            
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            setText(response.body().string());
                        }
                    });
                }
                @OnClick(R.id.btn_post)
                public void postRequest(){
                    OkHttpClient client = new OkHttpClient();
                    FormBody.Builder form = new FormBody.Builder();
                    form.add("userName", "hutianhang@docmail.cn");
                    form.add("password", "a123456");
                    form.add("clienttype", "mobile");
                    Request req = new Request.Builder()
                            .url("http://mail.docmail.cn/auth/login")
                            .post(form.build())
                            .build();
                    Call call = client.newCall(req);
                    call.enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            setText(e.getMessage());
                        }
            
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            setText(response.body().string());
                        }
                    });
                }
            
                private void setText(final String text){
                    tvContent.post(new Runnable() {
                        @Override
                        public void run() {
                            tvContent.setText(text);
                        }
                    });
                }
            }
      
    • 封裝通用網(wǎng)絡模塊

      • 為什么要封裝通用網(wǎng)絡模塊
        • 強大的可復用性
        • 與業(yè)務邏輯完全隔離
        • 強大的可擴展性
      • 封裝思路
        • 封裝一個公共的OkHttpClient
        • 封裝一個通用的請求創(chuàng)建類CommonRequest
        • 封裝一個通用的響應解析類JsonCommonRequest
        • 文件下載封裝
      • 代碼實戰(zhàn)通用網(wǎng)絡模塊封裝
      • 使用我們的網(wǎng)絡模塊

第四章 利用網(wǎng)絡框架封裝一個通用的網(wǎng)絡請求模塊

通用網(wǎng)絡框架封裝(詳見源碼)

第五章 使用封裝好的網(wǎng)絡模塊

使用實例(詳見源碼)

第六章 總結

網(wǎng)絡框架完全解析與應用

    - HTTP發(fā)展及okhttp優(yōu)勢
    - okhttp源碼解析及基礎用法
    - 基于okhttp封裝通用網(wǎng)絡模塊

大家最愛的部分

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容