1. 程式人生 > >客戶端與服務器端交互原理

客戶端與服務器端交互原理

http版本 原創文章 .get asc live title del 原創 的區別

經常看到HTTP客戶端與服務器端交互原理的各種版本的文章,但是專業術語太多,且流程過於復雜,不容易消化。於是就按照在 Servlet 裏面的內容大致做了一些穿插。本來連 Tomcat 容器 和 Servlet 的生命周期也準備在這裏一起寫的,但怕過於龐大,於是就簡單的引用了一些 Servlet 對象。這樣的一個整個流程看下來,相信至少在理解 HTTP協議和 request 和 response 是如何完成從請求到生成響應結果回發的。在後續的一些文章裏會專門講一講 Tomcat 和 Servlet 是如何處理請求和完成響應的,更多的是說明Servlet 的生命周期。

HTTP介紹

1.HTTP是一種超文本傳送協議(HyperText Transfer Protocol),是一套計算機在網絡中通信的一種規則。在TCP/IP體系結構中,HTTP屬於應用層協議,位於TCP/IP協議的頂層。

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

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

4.瀏覽Web時,瀏覽器通過HTTP協議與Web服務器交換信息,Web服務器向Web瀏覽器返回的文件都有與之相關的類型,這些信息類型的格式由MIME定義。

HTTP定義的事務處理由以下四步組成:

1.建立連接。

2.客戶端發送HTTP請求頭。

3.服務器端響應生成結果回發。

4.服務器端關閉連接,客戶端解析回發響應頭,恢復頁面。

1.建立連接:以下用我的另一篇文章的地址做為例子

Servlet容器(Tomacat)介紹及配置

客戶端,也就是我請求一個地址時,即打開了到 Web 服務器的HTTP端口的一個套接字。因為在網絡中間作為傳遞數據的實體介質就是網線,數據實質上是通過IO流進行輸出和輸入,這就不難理解我們為什麽在寫一個Servlet的時候要引用 import java.io.*; 的原因,包括我們在向客戶端回發結果的時候要用到 PrintWriter 對象的println()方法。

比如我在這裏請求CSDN社區的一個地址http://blog.csdn.net,

實際上首先要請求這個地址,以及一個端口80(8080)http://blog.csdn.net:80 80可以不寫,是因為瀏覽器網頁服務默認的端口號是 80.

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

Socket socket=new Socket("blog.csdn.net",8080);

InputStream in=socket.getInputStream();

OutputStream out=socket.getOutputStream();

2.客戶端發送HTTP請求頭

一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令,是一個ASCII文本請求行,後跟0個或多個HTTP頭標,一個空行和實現請求的任意數據。四個部分:請求行,請求頭標,空行和請求數據。

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

例如:GET lvpin/archive/2007/06/09/1645767.aspx 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 請求的哪一個服務器端地址,主地址 ,比如 我現在所在的CSDN blog.csdn.net/

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 /lvpin/archive/2007/06/09/1645767.aspx HTTP1.1

HOST: blog.csdn.net/

User-Agent :Mozilla/4.0

Accpt: image/gif,text/html,application/pdf,image/png...

key=value&key=value&key=value.....................................(POST()請求的數據)

那麽,這上面的一個例子說明的就是

我要去訪問的服務器端的地址是blog.csdn.net/ 它下面的資源 /lvpin/archive/2007/06/09/1645767.aspx連起來就是 http://blog.csdn.net/lvpin/archive/2007/06/09/1645767.aspx

這個頁面用的是 HTTP1.1 規範 我的瀏覽器版本是Mozilla/4.0

可以支持的MIME格式為 image/gif,text/html,application/pdf,image/png...等等

這個MIME格式我們response.setContentType("text/html;charset=gb2312");或者在一個 <%@ page contentType="text/html;charset=gb2312"%> 或者<meta .....contentType="text/html;charset=gb2312"..>總能見到

那麽在這裏如何理解 GET 和 POST 最直觀的區別,最明顯的就是 GET方法將數據的請求跟在了所請求的URL後面,也就是在請求行裏面我們是這麽樣來做的:

GET lvpin/archive/2007/06/09/1645767.aspx?

key=value&key=value&key=value......HTTP1.1

也實際上就是 用 GET 如此傳遞數據 :

http://blog.csdn.net/lvpin/archive/2007/06/09/1645767.aspx?name=simon&password=simonlv........

3.服務器端接受請求,處理數據後生成響應返回數據到客戶端 (部分Servlet 內容穿插)

Web 服務器 解析請求,定位指定的資源http://blog.csdn.net/lvpin/archive/2007/06/09/1645767.aspx

1)根據在 請求時的 GET/POST 來按照響應的 doGet() /doPost()方法來處理(有可能是一些業務邏輯,也有可能是一些驗證等等,也有可能是一些數據查詢,提交等等)其有效的數據就來源於name=simon&password=simonlv,還有其它的一些封裝在 request 對象中的數據資源。

2)處理請求之後,由 response 對象得到 PriterWriter 輸出流對象out ,通過 out.println () 將數據以 在客戶端提交過的采用的Accpt: 中形式的一種 如 按照 response.setcontentType("text/html;charset=gb2312‘ )的格式輸出流。

它的響應信息與請求信息非常類似,其區別就在於 我們在請求階段的請求行被狀態行給替換了,一個響應由四個部分組成:狀態行、響應頭標、空行、響應數據

1.狀態行:狀態行由三個標記組成: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:服務器端的錯誤

2.響應頭標:像請求頭標一樣,它們指出服務器的功能,標識出響應數據的細節。

Date: Sat,31 Dec 2005 23:59:59 GMT --響應生成的日期和時間

ContentType: text/html;charset=gb2312‘

Content-Length: 122 ---響應中的字節數,只在瀏覽器使用永久(Keep-alive)HTTP連接時需要。

3.空行:最後一個響應頭標之後是一個空行,發送回車符和退行,表明服務器以下不再有頭標。

4.響應數據:HTML文檔和圖像等,也就是HTML本身。out.println("<html>").......寫出的。。。

<html>

<head>

<title>Welcom to simon lv ‘s home</title>

</head>

<body>

<!-- 這裏是具體的內容,看到了這裏

相信大家對 HTTP 工作原理和服務器交互過程已經很清楚了吧

-->

</body>

</html>

5.服務器端關閉連接,客戶端解析回發響應頭,恢復頁面
---------------------
作者:千麽漾漾
來源:CSDN
原文:https://blog.csdn.net/qq_41786318/article/details/79594713
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

客戶端與服務器端交互原理