參考資料
http://www.lxweimin.com/p/1ae1170b9a9a
Android開發進階
一、Http理解
Http是一種應用層的協議,它基于TCP協議來進行數據傳輸。HTTP傳輸的特點
1.簡單快速:向服務器發送請求只需要傳遞請求方法和路徑
2.靈活:通過content-type表明傳遞的參數類型,可以傳遞任意參數
3.無連接:服務端處理完客戶端的請求,客戶端應答后,連接自動斷開。
4.無狀態:沒有辦法記錄每次連接的信息,如果后續請求需要前面的信息,只能重新傳遞一次。
交互步驟
1.客戶端端執行網絡請求,從url中解析出服務器的主機名
2.將服務器 的主機名解析成為IP
3.將端口號從URL中解析出來
4.與服務器建立一條TCP連接
5.客戶端發送一條請求報文到服務器
6.服務器發送一個響應報文給客戶端
7.客戶端解析響應報文,關閉連接
請求方法
GET:請求獲取Request-URI所標識的資源
POST:在Request-URI所標識的資源后附加新的數據
HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭
PUT 請求服務器存儲一個資源,并用Request-URI作為其標識
DELETE 請求服務器刪除Request-URI所標識的資源
TRACE 請求服務器回送收到的請求信息,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
請求報文
見參考資料鏈接
主要分為:1.請求行 2.請求報頭 3.請求數據
二、TCP數據傳輸的理解
TCP是傳輸控制協議,是面向連接
TCP數據是通過名為IP分組的小數據塊來發送數據的。HTTP發送數據的時候,會以流的形式打開一條TCP通道。TCP收到數據后,會講數據分割成小數據段,并將數據封裝在IP組中。通過因特網進行傳遞。
三、JAVA中使用Socket API實現TCP編程
一個程序作為客戶端還是服務端取決于它使用的Socket API
1.客戶端 : Socket
2.服務端 : SocketServer
客戶端:
創建一個Socket實例向指定的服務端地址建立一個TCP協議的連接通道。
1.SocketAddress:使用識別網絡主機
2.dstName:主機名稱、IP
3.dstPort : 端口號
服務端:
當客戶端創建Socket對象成功,進行連接成功時,此時只是把請求加入到服務端的請求隊列中,必須要等到服務端的accept方法調用后,連接通道才正式建立,可以互相通信。accept方法是從請求隊列中,取出連接請求。
創建一個Socket服務端,并且指定端口號,負責監聽該端口下收到的連接。
**backlog **參數負責設置服務端允許的請求連接數。
四、UDP協議
UDP數據報協議,是一種和TCP對應的協議,它不進行連接,而是直接把數據丟出去。所以傳遞數據非常快,但是容易丟包。通常音頻、視頻和普通數據在傳送時使用UDP較多
UDP編程需要DatagramPacket和DatagramSocket。因為UDP協議不建立連接,所以沒有服務端和客戶端。
UDP:發送端
- 建立udpsocket服務端點。該端點建立,系統會隨機分配一個端口。如果不想隨機配置,可以手動指定。 DatagramSocket ds = new DatagramSocket(9002);
- 將數據進行packet包的封裝,必須要指定目的地地址和端口。
DatagramPacket dp =new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),9001)
DatagramSocket mDatagramSocket = new DatagramSocket(udpServerPort);
//使用線程池開啟一個線程
getExecutorService().execute(new UDPReceiveRunnable(mDatagramSocket));
UDP接收線程
UDP發送線程
發送時必須要給DatagramPacket指定目的地,使用InetAddress來指定目的地