1. 程式人生 > >Android之網路協議篇

Android之網路協議篇

Android開發中要掌握的協議,一般包括Http協議和Tcp/Ip協議,如果開發藍芽裝置還要知道一些藍芽BLE協議。還有一個就是Socket程式設計,也是以Tcp/Ip協議為基礎的,並且和無線裝置比較相關。

一.Http協議

(一)Http基礎知識

超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。

(二)Http協議傳送請求資訊包括的四個內容

1.請求行

2.請求頭,又叫訊息頭

3.空行

4.請求體(可選),又叫訊息主體

(三)常用請求方式:Get請求和Post請求

1.Get請求和Post請求定義

GET - 向特定的資源發出請求。注意:GET方法不應當被用於產生"副作用"的操作中,例如在web app.中。其中一個原因是GET可能會被網路蜘蛛等隨意訪問。

POST - 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。

2.Get請求和Post請求區別

(1)最直觀的區別就是GET把引數包含在(請求行)URL中,POST通過(請求行+【請求頭+請求體】)request body傳遞引數。

(2)POST的安全性要比GET的安全性高。

(3)GET方式提交的資料最多隻能是1024位元組,理論上POST沒有限制

(4)Get是向伺服器發索取資料的一種請求,而Post是向伺服器提交資料的一種請求,在FORM(表單)中,Method預設為"GET",實質上,GET和POST只是傳送機制不同,並不是一個取一個發,POST請求也是可以進行索取資料!

3.Get請求和Post請求沒有區別(這也是一個論述的觀點)

HTTP只是個行為準則,而TCP才是GET和POST怎麼實現的基本。

GET和POST本質上就是TCP連結,並無差別。但是由於HTTP的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。

GET產生一個TCP資料包;POST產生兩個TCP資料包。

對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);

而對於POST,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200 ok(返回資料)。

二.Tcp/Ip

(一)基礎知識

TCP/IP字面上代表了兩個協議:TCP(傳輸控制協議)和IP(網際協議)。但是TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指因特網整個TCP/IP協議族。

從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層(又稱資料鏈路層)、網路層、傳輸層、應用層。

也就是說Tcp/Ip協議族不僅僅是字面上的網路層和傳輸層,它還包含資料鏈路層和應用層!

TCP是面向連線的通訊協議,通過三次握手建立連線,通訊完成時要拆除連線。

三次握手必須要會簡單的描述出來!

(二)三次握手

三次握手的簡單描述:

第一次握手:建立連線時,客戶端傳送a包到伺服器,等待伺服器確認;

第二次握手:伺服器收到a包,同時自己也傳送一個b包,即a+b包;

第三次握手:客戶端收到伺服器的a+b包,向伺服器傳送確認包,此包傳送完畢,客戶端和伺服器進入(TCP連線成功)狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。

圖解:

網上詳細答案: 第一次 第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。

第二次 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次 第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手。完成三次握手,客戶端與伺服器開始傳送資料,在上述過程中,還有一些重要的概念: (三)TCP和UDP的區別

1.TCP:面向連線、傳輸可靠(保證資料正確性,保證資料順序)、用於傳輸大量資料(流模式)、速度慢,建立連線需要開銷較多(時間,系統資源)。

2.UDP:面向非連線、傳輸不可靠、用於傳輸少量資料(資料包模式)、速度快。

三.Socket程式設計

(一)基礎知識

網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個雙向鏈路的一端稱為一個Socket。

Socket所支援的協議種類也不光TCP/IP一種,在Java環境下,Socket程式設計主要是指基於TCP/IP協議的網路程式設計。

一個Socket由一個IP地址(客戶端決定)和一個埠號(伺服器決定)唯一確定。

如果是藍芽設定的Socket ,UUID相當於Socket的埠,而藍芽地址相當於Socket的IP。

其實Socket程式設計程式包含一個Socket端和SocketService端。

(二)工作過程

其工作過程包含以下四個基本的步驟:

1. 建立Socket/SocketService;

2. 開啟連線到Socket/SocketService的輸入/出流;

3. 按照一定的協議對Socket/SocketService進行讀/寫操作;

4.關閉Socket/SocketService.

上面拿到Socket的輸入流就可以進行資料的讀取(如接收檔案或文字),拿到輸出流就可以進行資料的寫入(如傳送檔案或文字)。

三.藍芽BLE協議

這個知識我也是不知道怎麼詳細說,網上也沒有很相關的簡介。看那些電路圖,我也沒看懂是什麼鬼!

(一)基礎概念

藍芽協議包括核心協議層、替代電纜協議層、電話控制協議層和選用藍芽協議層。 

藍芽的核心協議由基帶,鏈路管理,邏輯鏈路控制與適應協議和服務搜尋協議等4部分組成。

藍芽BLE協議是藍芽4.0的協議,BLE代表的是低耗能裝置。

(二)藍芽2.0、3.0、4.0區別

藍芽2.0可以支援立體聲,而藍芽1.2版只支援單聲道!

藍芽3.0比藍芽2.0的傳輸速度有了質的提升,其他功能沒什麼變化。

藍芽4.0比之前的2.0和3.0有了很大的區別,主要特點有下面三個:

1.超低功耗

2.免配對密碼(一般通過NFC直連)

3.可以多連(一個耳機連2個收手機)

4.超長傳輸距離(理論100米,藍芽2.0、3.0理論上是10米)

(三)藍芽相關的類

 BlueToothAdapter這個類是藍芽裝置的管理類。        BlueToothDevice藍芽裝置物件,裡面包含藍芽的資料。  上面兩個類藍芽裝置都會有用到,下面這兩個類只有藍芽4.0才能用到。        BlueToothGatt低耗能藍芽裝置的控制物件        BlueToothGattCharateristic低耗能藍芽裝置的特徵值物件

(四)藍芽Socket程式設計(藍芽2.0、3.0都可以的)

1.UUID

在藍芽中,每個服務和服務屬性都唯一地由 全域性唯一識別符號 ,Universally Unique Identifier(UUID)來校驗。正如它的名字所暗示的,每一個這樣的識別符號都要在時空上保證唯一。 UUID相當於Socket的埠,而藍芽地址相當於Socket的IP。兩個藍芽裝置進行連線時需要使用同一個UUID,這是一個服務的唯一標識,而且這個UUID的值必須是  00001101-0000-1000-8000-00805F9B34FB 。

2.Socket程式設計

請看上面的描述。

藍芽開發:http://blog.csdn.net/wenzhi20102321/article/details/53870789

藍芽4.0開發示例:http://blog.csdn.net/wenzhi20102321/article/details/53893511

無線Wifi開發示例:http://blog.csdn.net/wenzhi20102321/article/details/53871216

Socket程式設計:http://blog.csdn.net/wenzhi20102321/article/details/52620323

Android網路程式設計:http://blog.csdn.net/wenzhi20102321/article/details/53182963