網(wǎng)絡(luò)框架解析與應(yīng)用

網(wǎng)絡(luò)框架解析與應(yīng)用

第一章

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

第二章 網(wǎng)絡(luò)框架出現(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é)議結(jié)構(gòu)

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

    • 多路復(fù)用請求

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

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

    • 壓縮HTTP頭

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

第三章 網(wǎng)絡(luò)框架源碼結(jié)構(gòu)分析

網(wǎng)絡(luò)框架源碼結(jié)構(gòu)

  • okhttp核心框架
    • 總體設(shè)計
      如圖所示:


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


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


      okhttp核心類圖.jpg
    • 多路復(fù)用機(jī)制
      如圖所示:


      okhttp多路復(fù)用.jpg
    • 重連機(jī)制
      如圖所示:


      okhttp重連.jpg
  • okhttp核心類(粗體為核心流程)
    • Route
      路由類:用來分發(fā)請求
    • ResponseBody
      響應(yīng)實體類:存放返回的數(shù)據(jù)贼急,在byte()方法中是最原始的字節(jié)數(shù)據(jù)
    • Response
      構(gòu)建者模式的響應(yīng)類
      • Headers headers
        所有的響應(yīng)頭
      • ResponseBody body
        響應(yīng)體
    • RequestBody
      請求類體類
      • FormBody
        請求頭
      • MultipartBody
        文件上傳等
    • Request
      構(gòu)建者模式的請求類
    • Call(Interface)
      請求任務(wù)
      HttpEngine engine
    • RealCall(Runnable) Call的實現(xiàn)類
      真正執(zhí)行響應(yīng)處理
      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)絡(luò)框架簡單使用

  • 簡單實現(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)絡(luò)模塊

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

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

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

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

使用實例(詳見源碼)

第六章 總結(jié)

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

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

大家最愛的部分

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末太抓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子令杈,更是在濱河造成了極大的恐慌走敌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗噩,死亡現(xiàn)場離奇詭異悔常,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)给赞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矫户,“玉大人片迅,你說我怎么就攤上這事〗粤桑” “怎么了柑蛇?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵芥挣,是天一觀的道長。 經(jīng)常有香客問我耻台,道長空免,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任盆耽,我火速辦了婚禮蹋砚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摄杂。我一直安慰自己坝咐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布析恢。 她就那樣靜靜地躺著墨坚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪映挂。 梳的紋絲不亂的頭發(fā)上泽篮,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音柑船,去河邊找鬼帽撑。 笑死,一個胖子當(dāng)著我的面吹牛椎组,可吹牛的內(nèi)容都是我干的油狂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寸癌,長吁一口氣:“原來是場噩夢啊……” “哼专筷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒸苇,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤磷蛹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溪烤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體味咳,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年檬嘀,在試婚紗的時候發(fā)現(xiàn)自己被綠了槽驶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸳兽,死狀恐怖掂铐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤全陨,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布爆班,位于F島的核電站,受9級特大地震影響辱姨,放射性物質(zhì)發(fā)生泄漏柿菩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一雨涛、第九天 我趴在偏房一處隱蔽的房頂上張望枢舶。 院中可真熱鬧,春花似錦镜悉、人聲如沸祟辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旧困。三九已至,卻和暖如春稼锅,著一層夾襖步出監(jiān)牢的瞬間吼具,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工矩距, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拗盒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓锥债,卻偏偏與公主長得像陡蝇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哮肚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容