- 相關(guān)推薦
Java web客戶(hù)端和服務(wù)器端交互的原理
其實(shí)HTTP客戶(hù)端和服務(wù)器端的交互原理很簡(jiǎn)單:即先是瀏覽器和服務(wù)器端建立Socket無(wú)狀態(tài)連接,也就是短連接,然后通過(guò)IO流進(jìn)行報文信息(這個(gè)報文是嚴格遵循HTTP報文接口的)的交互,最后會(huì )話(huà)結束后就關(guān)閉連接。對于這些底層的協(xié)議和報文的打包解包交互的實(shí)現,其實(shí)java和瀏覽器早都已經(jīng)封裝好了,程序員只要專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現就行。
1. 協(xié)議
a. TCP/IP整體構架概述
TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統的開(kāi)放式系統互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網(wǎng)路層、傳輸層、話(huà)路層、表示層和應用層。而TCP/IP通訊協(xié)議采用了4層的層級結構,每一層都呼叫它的下一層所提供的網(wǎng)絡(luò )來(lái)完成自己的需求。這4層分別為:
i. 應用層:應用程序間溝通的層,如超文本傳送協(xié)議(HTTP)、簡(jiǎn)單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò )遠程訪(fǎng)問(wèn)協(xié)議(Telnet)等。
ii. 傳輸層:在此層中,它提供了節點(diǎn)間的數據傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶(hù)數據報協(xié)議(UDP)等,TCP和UDP給數據包加入傳輸數據并把它傳輸到下一層中,這一層負責傳送數據,并且確定數據已被送達并接收。
iii. 互連網(wǎng)絡(luò )層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。
iv. 網(wǎng)絡(luò )接口層:對實(shí)際的網(wǎng)絡(luò )媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò )(如Ethernet、Serial Line等)來(lái)傳送數據。
b. HTTP協(xié)議介紹:
i. HTTP是一種超文本傳送協(xié)議(HyperText Transfer Protocol),是一套計算機在網(wǎng)絡(luò )中通信的一種規則。在TCP/IP體系結構中,HTTP屬于應用層協(xié)議,位于TCP/IP協(xié)議的頂層
ii. HTTP是一種無(wú)狀態(tài)的的協(xié)議,意思是指 在Web 瀏覽器(客戶(hù)端)和 Web 服務(wù)器之間不需要建立持久的連接。整個(gè)過(guò)程就是當一個(gè)客戶(hù)端向服務(wù)器端發(fā)送一個(gè)請求(request),然后Web服務(wù)器返回一個(gè)響應 (response),之后連接就關(guān)閉了,在服務(wù)端此時(shí)是沒(méi)有保留連接的信息。
iii. HTTP 遵循 請求/響應(request/response) 模型的,所有的通信交互都被構造在一套請求和響應模型中。
iv. 瀏覽WEB時(shí),瀏覽器通過(guò)HTTP協(xié)議與WEB服務(wù)器交換信息,Web服務(wù)器向Web瀏覽器返回的文件都有與之相關(guān)的類(lèi)型,這些信息類(lèi)型的格式由MIME定義。
c. 協(xié)議的java實(shí)現方式
不論是TCP/IP協(xié)議也好,還是HTTP協(xié)議也好,java都是通過(guò)套接字(java.net.Socket)來(lái)實(shí)現的,可以參考我的另一篇技術(shù)博客:一個(gè)項目看java TCP/IP Socket編程(1.3版)
2. HTTP報文接口及客戶(hù)端和服務(wù)器端交互原理
a. HTTP定義的事務(wù)處理由以下四步組成:
i. 建立連接:
例如我在瀏覽器里輸入 http://cuishen.iteye.com,客戶(hù)端請求這個(gè)地址時(shí)即打開(kāi)了web服務(wù)器HTTP端口的一個(gè)套接字。因為在網(wǎng)絡(luò )中間作為傳遞數據的實(shí)體介質(zhì)就是網(wǎng)線(xiàn),數據實(shí)質(zhì)上是通過(guò)IO流進(jìn)行輸出和輸入,這就不難理解我們?yōu)槭裁丛趯?xiě)一個(gè)Servlet的時(shí)候要引用 import java.io.*; 的原因 ,包括我們在向客戶(hù)端回發(fā)結果的時(shí)候要用到PrintWriter對象的println()方法。其實(shí)請求的這個(gè)地址還要加上端口號80,80可以不寫(xiě),是因為瀏覽器默認的端口號是80。
在Java底層代碼中是這樣實(shí)現的,只不過(guò)它們已經(jīng)幫我們做了。
Socket socket = new Socket("cuishen.iteye.com",80);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
ii. 客戶(hù)端發(fā)送HTTP請求報文(request)
一旦建立了TCP連接,Web瀏覽器就會(huì )向Web服務(wù)器發(fā)送請求命令,是一個(gè)ASCII文本請求行,后跟0個(gè)或多個(gè)HTTP頭標,一個(gè)空行和實(shí)現請求的任意數據。
即報文分四個(gè)部分:請求行,請求頭標,空行和請求數據
1)請求行
請求行由三個(gè)標記組成:請求方法、請求URL和HTTP版本,中間用空格分開(kāi)
例如: GET cuishen.iteye.com/blog/242842 HTTP/1.1
HTTP規范定義了8種可能的請求方法:(最常見(jiàn)的就是 GET 和 POST 兩種方法)
GET -- 檢索URI中標識資源的一個(gè)簡(jiǎn)單請求
HEAD -- 與GET方法相同,服務(wù)器只返回狀態(tài)行和頭標,并不返回請求文檔
POST -- 服務(wù)器接受被寫(xiě)入客戶(hù)端輸出流中的數據的請求
PUT -- 服務(wù)器保存請求數據作為指定URI新內容的請求
DELETE -- 服務(wù)器刪除URI中命名的資源的請求
OPTIONS -- 關(guān)于服務(wù)器支持的請求方法信息的請求
TRACE -- Web服務(wù)器反饋Http請求和其頭標的請求
CONNECT -- 已文檔化但當前未實(shí)現的一個(gè)方法,預留做隧道處理
2)請求頭標
請求頭標:由key :value 健值組成,每行一對。請求頭標用來(lái)通知服務(wù)器有關(guān)客戶(hù)端的功能和標識。
HOST -- 請求的哪一個(gè)服務(wù)器端地址,主地址,比如:我的技術(shù)blog:cuishen.iteye.com
User-Agent -- 用戶(hù)即客戶(hù)端可以使用的瀏覽器 ,如: Mozilla/4.0
Accept -- 即客戶(hù)端可以接受的MIME 類(lèi)型列表,如image/gif、text/html、application/msword
Content-Length -- 只適用于POST請求,以字節給出POST數據的尺寸
3)空行
發(fā)送回車(chē)符和退行,通知服務(wù)器以下不再有頭標。
4)請求數據
使用POST傳送數據,最常使用的是Content-Type和Content-Length頭標。
請求報文總結:
我們可以這樣寫(xiě)出一個(gè)標準的 HTTP請求:
POST /blog/242842 HTTP1.1
HOST: cuishen.iteye.com/
User-Agent: Mozilla/4.0
Accpt: image/gif,text/html,application/pdf,image/png...
key=value&key=value&key=value...... (POST()請求的數據)
這上面的一個(gè)例子意思是:
我要去訪(fǎng)問(wèn)的服務(wù)器端的地址是cuishen.iteye.com/ 它下面的資源 /blog/242842
連起來(lái)就是: cuishen.iteye.com/blog/242842
這個(gè)頁(yè)面用的是 HTTP1.1 規范,我的瀏覽器版本是Mozilla/4.0
可以支持的MIME格式為 image/gif,text/html,application/pdf,image/png...等等
這個(gè)MIME格式我們在servlet中寫(xiě)法是:response.setContentType("text/html;charset=gb2312");
或者在jsp中寫(xiě)法是:
或者在html中寫(xiě)法是:
GET 和 POST 最直觀(guān)的區別就是:GET方法將數據的請求跟在了所請求的URL后面,也就是在請求行里面我們是這么樣來(lái)做的:
GET /blog/242842?key=value&key=value&key=value......HTTP1.1
實(shí)際上用 GET 是這樣傳遞數據的:
http://cuishen.iteye.com/?page=2......
iii.服務(wù)器端響應請求生成結果并回發(fā)(response)
Web 服務(wù)器解析請求,定位指定的資源 http://cuishen.iteye.com/blog/242842
1)根據請求時(shí)的 GET/POST 對應的用servlet里的 doGet() / doPost()方法來(lái)處理(有可能是一些業(yè)務(wù)邏輯,也有可能是一些驗證等等,也有可能是一些數據查詢(xún),提交等等)其有效的數據就來(lái)源于key=value&key=value&key=value......,以及其它的一些封裝在 request 對象中的數據資源。
2)處理請求之后,由 response 對象得到 java.io.PrintWriter 輸出流對象out,通過(guò) out.println(); 將數據以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式輸出到輸出流。
它的響應報文與請求報文非常類(lèi)似,其區別就在于:我們在請求階段的請求行被狀態(tài)行給替換了,再來(lái)看響應報文:
3)一個(gè)響應報文由四個(gè)部分組成:狀態(tài)行、響應頭標、空行、響應數據:
(a).狀態(tài)行:
狀態(tài)行由三個(gè)標記組成:HTTP版本、響應代碼和響應描述。
HTTP1.1 --- 100 --- continue //繼續追加后繼內容
HTTP1.1 --- 200 --- OK //一切正常
HTTP1.1 --- 301 --- Moved Permanently //請求的文檔在其它地方,會(huì )自動(dòng)連接
HTTP1.1 --- 403 --- Forbidden //絕對拒絕你訪(fǎng)問(wèn)這個(gè)資源,不管授權沒(méi)有
HTTP1.1 --- 400 --- Bad Request //客戶(hù)端請求中的不良語(yǔ)法
HTTP1.1 --- 404 --- Not Found //最常見(jiàn),絕對是大名鼎鼎的找不到
HTTP響應碼:
1xx:提示性信息,告訴客戶(hù)端應該對某些其它的動(dòng)作作出響應
2xx:這些就代表了請求成功
3xx:重定向,為了完成請求,必須進(jìn)一步執行的動(dòng)作
4xx:客戶(hù)端錯誤
500-599: 服務(wù)器端的錯誤
(b).響應頭標:像請求頭標一樣,它們指出服務(wù)器的功能,標識出響應數據的細節。
Date: Sat, 31 Dec 2005 23:59:59 GMT --響應生成的日期和時(shí)間
ContentType: 'text/html;charset=gb2312'
Content-Length: 122 --響應中的字節數,只在瀏覽器使用永久(Keep-alive)HTTP連接時(shí)需要。
(c).空行:最后一個(gè)響應頭標之后是一個(gè)空行,發(fā)送回車(chē)符和退行,表明服務(wù)器以下不再有頭標。
(d).響應數據:HTML文檔和圖像等,也就是HTML本身。out.println("......");寫(xiě)到客戶(hù)端。
iv. 服務(wù)器端關(guān)閉連接,客戶(hù)端解析回發(fā)響應報文,恢復頁(yè)面
1)瀏覽器先解析狀態(tài)行,查看請求是否成功的狀態(tài)代碼--HTTP響應碼:404 400 200 ....
2)解析每一個(gè)響應頭標,如:
ContentType: text/html;charset=gb2312
Content-Length: 122 --- 響應中的字節數,只在瀏覽器使用永久(Keep-alive)HTTP連接時(shí)需要。
3)讀取響應數據HTML,根據標簽中的內容恢復標準的HTML格式頁(yè)面或者其它。
4)一個(gè)HTML 文檔可能包含其它的需要被載入的資源,瀏覽器會(huì )識別,并對這些資源再進(jìn)行額外的請求,這個(gè)過(guò)程可以是循環(huán)的方式一直到所有的數據都按照響應頭標中規定的格式恢復到頁(yè)面中。
5)數據傳送完畢,服務(wù)器端關(guān)閉連接,即無(wú)狀態(tài)協(xié)議。
【Java web客戶(hù)端和服務(wù)器端交互的原理】相關(guān)文章:
Java與Java web的區別08-10
客戶(hù)端交互技術(shù)介紹10-08
Java Web開(kāi)發(fā)和J2EE的區別07-07
關(guān)于java-web的試卷06-25
Java開(kāi)發(fā)web的幾種開(kāi)發(fā)模式12-13
j2ee與java web的區別09-19