參考資料
http://www.itdecent.cn/p/1ae1170b9a9a
Android開發(fā)進階
一、Http理解
Http是一種應(yīng)用層的協(xié)議,它基于TCP協(xié)議來進行數(shù)據(jù)傳輸。HTTP傳輸?shù)奶攸c
1.簡單快速:向服務(wù)器發(fā)送請求只需要傳遞請求方法和路徑
2.靈活:通過content-type表明傳遞的參數(shù)類型,可以傳遞任意參數(shù)
3.無連接:服務(wù)端處理完客戶端的請求,客戶端應(yīng)答后,連接自動斷開。
4.無狀態(tài):沒有辦法記錄每次連接的信息,如果后續(xù)請求需要前面的信息,只能重新傳遞一次。
交互步驟
1.客戶端端執(zhí)行網(wǎng)絡(luò)請求,從url中解析出服務(wù)器的主機名
2.將服務(wù)器 的主機名解析成為IP
3.將端口號從URL中解析出來
4.與服務(wù)器建立一條TCP連接
5.客戶端發(fā)送一條請求報文到服務(wù)器
6.服務(wù)器發(fā)送一個響應(yīng)報文給客戶端
7.客戶端解析響應(yīng)報文,關(guān)閉連接
請求方法
GET:請求獲取Request-URI所標(biāo)識的資源
POST:在Request-URI所標(biāo)識的資源后附加新的數(shù)據(jù)
HEAD 請求獲取由Request-URI所標(biāo)識的資源的響應(yīng)消息報頭
PUT 請求服務(wù)器存儲一個資源,并用Request-URI作為其標(biāo)識
DELETE 請求服務(wù)器刪除Request-URI所標(biāo)識的資源
TRACE 請求服務(wù)器回送收到的請求信息,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項和需求
請求報文
見參考資料鏈接
主要分為:1.請求行 2.請求報頭 3.請求數(shù)據(jù)
二、TCP數(shù)據(jù)傳輸?shù)睦斫?/h3>
TCP是傳輸控制協(xié)議,是面向連接
TCP數(shù)據(jù)是通過名為IP分組的小數(shù)據(jù)塊來發(fā)送數(shù)據(jù)的。HTTP發(fā)送數(shù)據(jù)的時候,會以流的形式打開一條TCP通道。TCP收到數(shù)據(jù)后,會講數(shù)據(jù)分割成小數(shù)據(jù)段,并將數(shù)據(jù)封裝在IP組中。通過因特網(wǎng)進行傳遞。
三、JAVA中使用Socket API實現(xiàn)TCP編程
一個程序作為客戶端還是服務(wù)端取決于它使用的Socket API
1.客戶端 : Socket
2.服務(wù)端 : SocketServer
客戶端:
創(chuàng)建一個Socket實例向指定的服務(wù)端地址建立一個TCP協(xié)議的連接通道。
1.SocketAddress:使用識別網(wǎng)絡(luò)主機
2.dstName:主機名稱、IP
3.dstPort : 端口號

服務(wù)端:
當(dāng)客戶端創(chuàng)建Socket對象成功,進行連接成功時,此時只是把請求加入到服務(wù)端的請求隊列中,必須要等到服務(wù)端的accept方法調(diào)用后,連接通道才正式建立,可以互相通信。accept方法是從請求隊列中,取出連接請求。
創(chuàng)建一個Socket服務(wù)端,并且指定端口號,負(fù)責(zé)監(jiān)聽該端口下收到的連接。
**backlog **參數(shù)負(fù)責(zé)設(shè)置服務(wù)端允許的請求連接數(shù)。


四、UDP協(xié)議
UDP數(shù)據(jù)報協(xié)議,是一種和TCP對應(yīng)的協(xié)議,它不進行連接,而是直接把數(shù)據(jù)丟出去。所以傳遞數(shù)據(jù)非???,但是容易丟包。通常音頻、視頻和普通數(shù)據(jù)在傳送時使用UDP較多
UDP編程需要DatagramPacket和DatagramSocket。因為UDP協(xié)議不建立連接,所以沒有服務(wù)端和客戶端。
UDP:發(fā)送端
- 建立udpsocket服務(wù)端點。該端點建立,系統(tǒng)會隨機分配一個端口。如果不想隨機配置,可以手動指定。 DatagramSocket ds = new DatagramSocket(9002);
- 將數(shù)據(jù)進行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發(fā)送線程
發(fā)送時必須要給DatagramPacket指定目的地,使用InetAddress來指定目的地

