淺析Java web程式之用戶端和伺服器端互動原理(轉)

來源:互聯網
上載者:User

標籤:

轉載自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html

1. 協議

a. TCP/IP整體構架概述

   TCP/IP協議並不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通訊協定的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互連信。這7層是:物理層、資料連結層、網路層、傳輸層、話路層、展示層和應用程式層。而TCP/IP通訊協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這4層分別為:

   i.   應用程式層:應用程式間溝通的層,如超文本傳送協議(HTTP)、簡單電子郵件傳輸(SMTP)、檔案傳輸通訊協定(FTP)、網路遠端存取協議(Telnet)等。

   ii.  傳輸層:在此層中,它提供了節點間的資料傳送服務,如傳輸控制通訊協定(TCP)、使用者資料包通訊協定(UDP)等,TCP和UDP給資料包加入傳輸資料並把它傳輸到下一層中,這一層負責傳送資料,並且確定資料已被送達並接收。
  
   iii. 互連網路層:負責提供基本的資料封包傳送功能,讓每一塊資料包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。

   iv.  網路介面層:對實際的網路媒體的管理,定義如何使用實際網路(如Ethernet、Serial Line等)來傳送資料。

b. HTTP協議介紹:

   i.   HTTP是一種超文本傳送協議(HyperText Transfer Protocol),是一套電腦在網路中通訊的一種規則。在TCP/IP體繫結構中,HTTP屬於應用程式層協議,位於TCP/IP協議的頂層

   ii.  HTTP是一種無狀態的的協議,意思是指 在網頁瀏覽器(用戶端)和 Web 服務器之間不需要建立持久的串連。整個過程就是當一個用戶端向伺服器端發送一個請求(request),然後Web伺服器返回一個響應 (response),之後串連就關閉了,在服務端此時是沒有保留串連的資訊。

   iii. HTTP 遵循 請求/響應(request/response) 模型的,所有的通訊互動都被構造在一套請求和響應模型中。

   iv.  瀏覽WEB時,瀏覽器通過HTTP協議與WEB伺服器交換資訊,Web伺服器向Web瀏覽器返回的檔案都有與之相關的類型,這些資訊類型的格式由MIME定義。

c. 協議的java實現方式
  
   不論是TCP/IP協議也好,還是HTTP協議也好,java都是通過通訊端(java.net.Socket)來實現的,可以參考另一篇技術部落格:一個項目看java TCP/IP Socket編程(1.3版)


2. HTTP報文介面及用戶端和伺服器端互動原理

a. HTTP定義的交易處理由以下四步組成:

   i.  建立串連:

   例如我在瀏覽器裡輸入 http://cuishen.iteye.com,用戶端請求這個地址時即開啟了web伺服器HTTP連接埠的一個通訊端。因為在網路中間作為傳遞資料的實體介質就是網線,資料實質上是通過IO流進行輸出和輸入,這就不難理解我們為什麼在寫一個Servlet的時候要引用 import java.io.*; 的原因 ,包括我們在向用戶端回傳結果的時候要用到PrintWriter對象的println()方法。其實請求的這個地址還要加上連接埠號碼80,80可以不寫,是因為瀏覽器預設的連接埠號碼是80。

   在Java底層代碼中是這樣實現的,只不過它們已經幫我們做了。

1.Socket socket = new Socket("cuishen.iteye.com",80);  2.InputStream in = socket.getInputStream();  3.OutputStream out = socket.getOutputStream();  

ii. 用戶端發送HTTP請求報文(request)

   一旦建立了TCP串連,Web瀏覽器就會向Web伺服器發送請求命令,是一個ASCII文本請求行,後跟0個或多個HTTP頭標,一個空行和實現請求的任意資料。

   即報文分四個部分:請求行,要求標頭標,空行和請求資料

     1)請求行
    
     請求行由三個標記組成:要求方法、請求URL和HTTP版本,中間用空格分開

     例如: GET cuishen.iteye.com/blog/242842 HTTP/1.1

HTTP規範定義了8種可能的要求方法:(最常見的就是 GET 和 POST 兩種方法)

GET -- 檢索URI中標識資源的一個簡單請求
HEAD -- 與GET方法相同,伺服器只返回狀態行和頭標,並不返回請求文檔
POST -- 伺服器接受被寫入用戶端輸出資料流中的資料的請求
PUT -- 伺服器儲存請求資料作為指定URI新內容的請求
DELETE -- 伺服器刪除URI中命名的資源的請求
OPTIONS -- 關於伺服器支援的要求方法資訊的請求
TRACE -- Web伺服器反饋Http請求和其頭標的請求
CONNECT -- 已文檔化但當前未實現的一個方法,預留做隧道處理

     2)要求標頭標

要求標頭標:由key :value 健值組成,每行一對。要求標頭標用來通知伺服器有關用戶端的功能和標識。

HOST -- 請求的哪一個伺服器端地址,主地址,比如:我的技術blog:cuishen.iteye.com
User-Agent -- 使用者即用戶端可以使用的瀏覽器 ,如: Mozilla/4.0
Accept -- 即用戶端可以接受的MIME 類型列表,如image/gif、text/html、application/msword
Content-Length -- 只適用於POST請求,以位元組給出POST資料的尺寸

     3)空行 

發送斷行符號符和退行,通知伺服器以下不再有頭標。

     4)請求資料

使用POST傳送資料,最常使用的是Content-Type和Content-Length頭標。

    
     請求報文總結:
    
     我們可以這樣寫出一個標準的 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()請求的資料)

     這上面的一個例子意思是:
    
我要去訪問的伺服器端的地址是cuishen.iteye.com/ 它下面的資源 /blog/242842
連起來就是: cuishen.iteye.com/blog/242842
這個頁面用的是 HTTP1.1 規範,我的瀏覽器版本是Mozilla/4.0 
可以支援的MIME格式為  image/gif,text/html,application/pdf,image/png...等等

這個MIME格式我們在servlet中寫法是:response.setContentType("text/html;charset=gb2312");
或者在jsp中寫法是:<%@ page contentType="text/html;charset=gb2312"%>
或者在html中寫法是:<meta http-equiv="content-Type" content="text/html; charset=gb2312">

GET 和 POST 最直觀的區別就是:GET方法將資料的請求跟在了所請求的URL後面,也就是在請求行裡面我們是這麼樣來做的:

GET  /blog/242842?key=value&key=value&key=value......HTTP1.1

實際上用 GET 是這樣傳遞資料的:

http://cuishen.iteye.com/?page=2......


   iii.伺服器端響應請求產生結果並回傳(response)


     Web 服務器解析請求,定位指定的資源 http://cuishen.iteye.com/blog/242842


     1)根據請求時的 GET/POST 對應的用servlet裡的 doGet() / doPost()方法來處理(有可能是一些商務邏輯,也有可能是一些驗證等等,也有可能是一些資料查詢,提交等等)其有效資料就來源於key=value&key=value&key=value......,以及其它的一些封裝在 request 對象中的資料資源。

    
     2)處理請求之後,由 response 對象得到 java.io.PrintWriter 輸出資料流對象out,通過 out.println(); 將資料以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式輸出到輸出資料流。

     它的響應報文與請求報文非常類似,其區別就在於:我們在要求階段的請求行被狀態行給替換了,再來看響應報文:


     3)一個響應報文由四個部分組成:狀態行、回應標頭標、空行、響應資料:

(a).狀態行:

    狀態行由三個標記組成:HTTP版本、響應代碼和響應描述。
                                                               
HTTP1.1 --- 100 --- continue  //繼續追加後繼內容
HTTP1.1 --- 200 --- OK  //一切正常
HTTP1.1 --- 301 --- Moved Permanently  //請求的文檔在其它地方,會自動連接
HTTP1.1 --- 403 --- Forbidden  //絕對拒絕你訪問這個資源,不管授權沒有
HTTP1.1 --- 400 --- Bad Request  //用戶端請求中的不良文法
HTTP1.1 --- 404 --- Not Found  //最常見,絕對是大名鼎鼎的找不到

    HTTP響應碼:

1xx:提示性資訊,告訴用戶端應該對某些其它的動作作出響應
2xx:這些就代表了請求成功
3xx:重新導向,為了完成請求,必須進一步執行的動作
4xx:用戶端錯誤
500-599: 伺服器端的錯誤

(b).回應標頭標:像要求標頭標一樣,它們指出伺服器的功能,標識出響應資料的細節。

    Date: Sat, 31 Dec 2005 23:59:59 GMT  --響應產生的日期和時間
    ContentType: ‘text/html;charset=gb2312‘
            Content-Length: 122  --響應中的位元組數,只在瀏覽器使用永久(Keep-alive)HTTP串連時需要。

(c).空行:最後一個回應標頭標之後是一個空行,發送斷行符號符和退行,表明伺服器以下不再有頭標。

(d).響應資料:HTML文檔和映像等,也就是HTML本身。out.println("<html>......");寫到用戶端。

1.<html>  2.<head>  3.<title>Welcome to cuishen‘s IT blog</title>  4.</head>  5.<body>  6.<!-- 這裡是具體的內容,看到了這裡  7.相信大家對 HTTP 工作原理及用戶端與伺服器互動過程已經很清楚了吧  8.-->   9.</body>  10.</html>  

iv. 伺服器端關閉串連,用戶端解析回傳響應報文,恢複頁面

1)瀏覽器先解析狀態行,查看請求是否成功的狀態碼--HTTP響應碼:404 400 200 ....

2)解析每一個回應標頭標,如:

ContentType: text/html;charset=gb2312                                                                                                                                                 
Content-Length: 122 --- 響應中的位元組數,只在瀏覽器使用永久(Keep-alive)HTTP串連時需要。

3)讀取響應資料HTML,根據標籤<html></html>中的內容恢複標準的HTML格式頁面或者其它。

4)一個HTML 文檔可能包含其它的需要被載入的資源,瀏覽器會識別,並對這些資源再進行額外的請求,這個過程可以是迴圈的方式一直到所有的資料都按照回應標頭標中規定的格式恢複到頁面中。

5)資料傳送完畢,伺服器端關閉串連,即無狀態協議。

3. 總結

不要被高深的名詞和理論嚇到,其實HTTP用戶端和伺服器端的互動原理很簡單:即先是瀏覽器和伺服器端建立Socket無狀態串連,也就是短串連,然後通過IO流進行報文資訊(這個報文是嚴格遵循HTTP報文介面的)的互動,最後會話結束後就關閉串連。對於這些底層的協議和報文的打包解包互動的實現,其實java和瀏覽器早都已經封裝好了,程式員只要專註於商務邏輯的實現就行啦,這些都不必關心!!

淺析Java web程式之用戶端和伺服器端互動原理(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.