偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺析Java web程序之客戶(hù)端和服務(wù)器端交互原理

開(kāi)發(fā) 后端
本文從兩個(gè)內(nèi)容淺析了Java web程序的客戶(hù)端和服務(wù)器端交互原理,第一,協(xié)議;第二,HTTP保溫接口及客戶(hù)端和服務(wù)器端的交互原理。詳細(xì)請(qǐng)看下文

1. 協(xié)議

a. TCP/IP整體構(gòu)架概述

TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開(kāi)放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話(huà)路層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。這4層分別為:

i. 應(yīng)用層:應(yīng)用程序間溝通的層,如超文本傳送協(xié)議(HTTP)、簡(jiǎn)單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問(wèn)協(xié)議(Telnet)等。

ii. 傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又?,這一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。

iii. 互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。

iv. 網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來(lái)傳送數(shù)據(jù)。

b. HTTP協(xié)議介紹:

i. HTTP是一種超文本傳送協(xié)議(HyperText Transfer Protocol),是一套計(jì)算機(jī)在網(wǎng)絡(luò)中通信的一種規(guī)則。在TCP/IP體系結(jié)構(gòu)中,HTTP屬于應(yīng)用層協(xié)議,位于TCP/IP協(xié)議的頂層

ii. HTTP是一種無(wú)狀態(tài)的的協(xié)議,意思是指 在Web 瀏覽器(客戶(hù)端)和 Web 服務(wù)器之間不需要建立持久的連接。整個(gè)過(guò)程就是當(dāng)一個(gè)客戶(hù)端向服務(wù)器端發(fā)送一個(gè)請(qǐng)求(request),然后Web服務(wù)器返回一個(gè)響應(yīng) (response),之后連接就關(guān)閉了,在服務(wù)端此時(shí)是沒(méi)有保留連接的信息。

iii. HTTP 遵循 請(qǐng)求/響應(yīng)(request/response) 模型的,所有的通信交互都被構(gòu)造在一套請(qǐng)求和響應(yīng)模型中。

iv. 瀏覽WEB時(shí),瀏覽器通過(guò)HTTP協(xié)議與WEB服務(wù)器交換信息,Web服務(wù)器向Web瀏覽器返回的文件都有與之相關(guān)的類(lèi)型,這些信息類(lèi)型的格式由MIME定義。

c. 協(xié)議的java實(shí)現(xiàn)方式

不論是TCP/IP協(xié)議也好,還是HTTP協(xié)議也好,java都是通過(guò)套接字(java.net.Socket)來(lái)實(shí)現(xiàn)的,可以參考我的另一篇技術(shù)博客:一個(gè)項(xiàng)目看java TCP/IP Socket編程(1.3版)

2. HTTP報(bào)文接口及客戶(hù)端和服務(wù)器端交互原理

a. HTTP定義的事務(wù)處理由以下四步組成:

i. 建立連接:

例如我在瀏覽器里輸入 http://cuishen.iteye.com,客戶(hù)端請(qǐng)求這個(gè)地址時(shí)即打開(kāi)了web服務(wù)器HTTP端口的一個(gè)套接字。因?yàn)樵诰W(wǎng)絡(luò)中間作為傳遞數(shù)據(jù)的實(shí)體介質(zhì)就是網(wǎng)線(xiàn),數(shù)據(jù)實(shí)質(zhì)上是通過(guò)IO流進(jìn)行輸出和輸入,這就不難理解我們?yōu)槭裁丛趯?xiě)一個(gè)Servlet的時(shí)候要引用 import java.io.*; 的原因 ,包括我們?cè)谙蚩蛻?hù)端回發(fā)結(jié)果的時(shí)候要用到PrintWriter對(duì)象的println()方法。其實(shí)請(qǐng)求的這個(gè)地址還要加上端口號(hào)80,80可以不寫(xiě),是因?yàn)闉g覽器默認(rèn)的端口號(hào)是80。

在Java底層代碼中是這樣實(shí)現(xiàn)的,只不過(guò)它們已經(jīng)幫我們做了。

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

ii. 客戶(hù)端發(fā)送HTTP請(qǐng)求報(bào)文(request)

一旦建立了TCP連接,Web瀏覽器就會(huì)向Web服務(wù)器發(fā)送請(qǐng)求命令,是一個(gè)ASCII文本請(qǐng)求行,后跟0個(gè)或多個(gè)HTTP頭標(biāo),一個(gè)空行和實(shí)現(xiàn)請(qǐng)求的任意數(shù)據(jù)。

即報(bào)文分四個(gè)部分:請(qǐng)求行,請(qǐng)求頭標(biāo),空行和請(qǐng)求數(shù)據(jù)

1)請(qǐng)求行

請(qǐng)求行由三個(gè)標(biāo)記組成:請(qǐng)求方法、請(qǐng)求URL和HTTP版本,中間用空格分開(kāi)

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

HTTP規(guī)范定義了8種可能的請(qǐng)求方法:(最常見(jiàn)的就是 GET 和 POST 兩種方法)

  • GET -- 檢索URI中標(biāo)識(shí)資源的一個(gè)簡(jiǎn)單請(qǐng)求
  • HEAD -- 與GET方法相同,服務(wù)器只返回狀態(tài)行和頭標(biāo),并不返回請(qǐng)求文檔
  • POST -- 服務(wù)器接受被寫(xiě)入客戶(hù)端輸出流中的數(shù)據(jù)的請(qǐng)求
  • PUT -- 服務(wù)器保存請(qǐng)求數(shù)據(jù)作為指定URI新內(nèi)容的請(qǐng)求
  • DELETE -- 服務(wù)器刪除URI中命名的資源的請(qǐng)求
  • OPTIONS -- 關(guān)于服務(wù)器支持的請(qǐng)求方法信息的請(qǐng)求
  • TRACE -- Web服務(wù)器反饋Http請(qǐng)求和其頭標(biāo)的請(qǐng)求
  • CONNECT -- 已文檔化但當(dāng)前未實(shí)現(xiàn)的一個(gè)方法,預(yù)留做隧道處理

2)請(qǐng)求頭標(biāo)

請(qǐng)求頭標(biāo):由key :value 健值組成,每行一對(duì)。請(qǐng)求頭標(biāo)用來(lái)通知服務(wù)器有關(guān)客戶(hù)端的功能和標(biāo)識(shí)。

HOST -- 請(qǐng)求的哪一個(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請(qǐng)求,以字節(jié)給出POST數(shù)據(jù)的尺寸

3)空行

發(fā)送回車(chē)符和退行,通知服務(wù)器以下不再有頭標(biāo)。

4)請(qǐng)求數(shù)據(jù)

使用POST傳送數(shù)據(jù),最常使用的是Content-Type和Content-Length頭標(biāo)。

請(qǐng)求報(bào)文總結(jié):

我們可以這樣寫(xiě)出一個(gè)標(biāo)準(zhǔn)的 HTTP請(qǐng)求:

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()請(qǐng)求的數(shù)據(jù))

這上面的一個(gè)例子意思是:

我要去訪問(wèn)的服務(wù)器端的地址是cuishen.iteye.com/ 它下面的資源 /blog/242842
連起來(lái)就是: cuishen.iteye.com/blog/242842
這個(gè)頁(yè)面用的是 HTTP1.1 規(guī)范,我的瀏覽器版本是Mozilla/4.0
可以支持的MIME格式為 image/gif,text/html,application/pdf,image/png...等等
這個(gè)MIME格式我們?cè)趕ervlet中寫(xiě)法是:response.setContentType("text/html;charset=gb2312");
或者在jsp中寫(xiě)法是:<%@ page contentType="text/html;charset=gb2312"%>
或者在html中寫(xiě)法是:<meta http-equiv="content-Type" content="text/html; charset=gb2312">

GET 和 POST 最直觀的區(qū)別就是:GET方法將數(shù)據(jù)的請(qǐng)求跟在了所請(qǐng)求的URL后面,也就是在請(qǐng)求行里面我們是這么樣來(lái)做的:

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

實(shí)際上用 GET 是這樣傳遞數(shù)據(jù)的:

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

iii.服務(wù)器端響應(yīng)請(qǐng)求生成結(jié)果并回發(fā)(response)

Web 服務(wù)器解析請(qǐng)求,定位指定的資源 http://cuishen.iteye.com/blog/242842

1)根據(jù)請(qǐng)求時(shí)的 GET/POST 對(duì)應(yīng)的用servlet里的 doGet() / doPost()方法來(lái)處理(有可能是一些業(yè)務(wù)邏輯,也有可能是一些驗(yàn)證等等,也有可能是一些數(shù)據(jù)查詢(xún),提交等等)其有效的數(shù)據(jù)就來(lái)源于key=value&key=value&key=value......,以及其它的一些封裝在 request 對(duì)象中的數(shù)據(jù)資源。

2)處理請(qǐng)求之后,由 response 對(duì)象得到 java.io.PrintWriter 輸出流對(duì)象out,通過(guò) out.println(); 將數(shù)據(jù)以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式輸出到輸出流。

它的響應(yīng)報(bào)文與請(qǐng)求報(bào)文非常類(lèi)似,其區(qū)別就在于:我們?cè)谡?qǐng)求階段的請(qǐng)求行被狀態(tài)行給替換了,再來(lái)看響應(yīng)報(bào)文:

3)一個(gè)響應(yīng)報(bào)文由四個(gè)部分組成:狀態(tài)行、響應(yīng)頭標(biāo)、空行、響應(yīng)數(shù)據(jù):

(a).狀態(tài)行:

狀態(tài)行由三個(gè)標(biāo)記組成:HTTP版本、響應(yīng)代碼和響應(yīng)描述。

HTTP1.1 --- 100 --- continue //繼續(xù)追加后繼內(nèi)容
HTTP1.1 --- 200 --- OK //一切正常
HTTP1.1 --- 301 --- Moved Permanently //請(qǐng)求的文檔在其它地方,會(huì)自動(dòng)連接
HTTP1.1 --- 403 --- Forbidden //絕對(duì)拒絕你訪問(wèn)這個(gè)資源,不管授權(quán)沒(méi)有
HTTP1.1 --- 400 --- Bad Request //客戶(hù)端請(qǐng)求中的不良語(yǔ)法
HTTP1.1 --- 404 --- Not Found //最常見(jiàn),絕對(duì)是大名鼎鼎的找不到

HTTP響應(yīng)碼:

1xx:提示性信息,告訴客戶(hù)端應(yīng)該對(duì)某些其它的動(dòng)作作出響應(yīng)
2xx:這些就代表了請(qǐng)求成功
3xx:重定向,為了完成請(qǐng)求,必須進(jìn)一步執(zhí)行的動(dòng)作
4xx:客戶(hù)端錯(cuò)誤
500-599: 服務(wù)器端的錯(cuò)誤

(b).響應(yīng)頭標(biāo):像請(qǐng)求頭標(biāo)一樣,它們指出服務(wù)器的功能,標(biāo)識(shí)出響應(yīng)數(shù)據(jù)的細(xì)節(jié)。

Date: Sat, 31 Dec 2005 23:59:59 GMT --響應(yīng)生成的日期和時(shí)間
ContentType: 'text/html;charset=gb2312'
Content-Length: 122 --響應(yīng)中的字節(jié)數(shù),只在瀏覽器使用永久(Keep-alive)HTTP連接時(shí)需要。

(c).空行:最后一個(gè)響應(yīng)頭標(biāo)之后是一個(gè)空行,發(fā)送回車(chē)符和退行,表明服務(wù)器以下不再有頭標(biāo)。

(d).響應(yīng)數(shù)據(jù):HTML文檔和圖像等,也就是HTML本身。out.println("<html>......");寫(xiě)到客戶(hù)端。

  1. <html>    
  2. <head>    
  3. <title>Welcome to cuishen's IT blog</title>    
  4. </head>    
  5. <body>    
  6. <!-- 這里是具體的內(nèi)容,看到了這里    
  7. 相信大家對(duì) HTTP 工作原理及客戶(hù)端與服務(wù)器交互過(guò)程已經(jīng)很清楚了吧    
  8. -->     
  9. </body>    
  10. </html> 

iv. 服務(wù)器端關(guān)閉連接,客戶(hù)端解析回發(fā)響應(yīng)報(bào)文,恢復(fù)頁(yè)面

1)瀏覽器先解析狀態(tài)行,查看請(qǐng)求是否成功的狀態(tài)代碼--HTTP響應(yīng)碼:404 400 200 ....

2)解析每一個(gè)響應(yīng)頭標(biāo),如:

ContentType: text/html;charset=gb2312
Content-Length: 122 --- 響應(yīng)中的字節(jié)數(shù),只在瀏覽器使用永久(Keep-alive)HTTP連接時(shí)需要。

3)讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)標(biāo)簽<html></html>中的內(nèi)容恢復(fù)標(biāo)準(zhǔn)的HTML格式頁(yè)面或者其它。

4)一個(gè)HTML 文檔可能包含其它的需要被載入的資源,瀏覽器會(huì)識(shí)別,并對(duì)這些資源再進(jìn)行額外的請(qǐng)求,這個(gè)過(guò)程可以是循環(huán)的方式一直到所有的數(shù)據(jù)都按照響應(yīng)頭標(biāo)中規(guī)定的格式恢復(fù)到頁(yè)面中。

5)數(shù)據(jù)傳送完畢,服務(wù)器端關(guān)閉連接,即無(wú)狀態(tài)協(xié)議。

3. 總結(jié)

不要被高深的名詞和理論嚇到,其實(shí)HTTP客戶(hù)端和服務(wù)器端的交互原理很簡(jiǎn)單:即先是瀏覽器和服務(wù)器端建立Socket無(wú)狀態(tài)連接,也就是短連接,然后通過(guò)IO流進(jìn)行報(bào)文信息(這個(gè)報(bào)文是嚴(yán)格遵循HTTP報(bào)文接口的)的交互,最后會(huì)話(huà)結(jié)束后就關(guān)閉連接。對(duì)于這些底層的協(xié)議和報(bào)文的打包解包交互的實(shí)現(xiàn),其實(shí)java和瀏覽器早都已經(jīng)封裝好了,程序員只要專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn)就行啦,這些都不必關(guān)心??!

原文鏈接:http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html

【編輯推薦】

  1. Java程序設(shè)計(jì):圖形與多媒體處理
  2. Apache CXF實(shí)戰(zhàn)之三:傳輸Java對(duì)象
  3. JavaScript寫(xiě)法你更偏向哪個(gè)
  4. 看JavaScript如何實(shí)現(xiàn)頁(yè)面自適
  5. Java集合框架總結(jié):TreeSet類(lèi)的排序問(wèn)題

 

責(zé)任編輯:林師授 來(lái)源: 013的博客
相關(guān)推薦

2010-03-01 16:10:32

Linux Samba

2011-03-28 17:24:26

2018-12-20 08:50:53

TCPIP服務(wù)器

2010-03-19 09:26:34

Java Socket

2010-01-11 13:05:24

VNC server配

2018-04-12 10:55:41

Android服務(wù)器數(shù)據(jù)

2024-02-22 13:47:40

2025-06-19 02:30:00

Spring服務(wù)器MCP

2009-09-16 15:44:25

2009-08-18 12:51:19

服務(wù)器+客戶(hù)端

2009-06-10 16:25:02

2011-06-07 16:01:46

Android 服務(wù)器 數(shù)據(jù)交互

2021-10-14 08:39:17

Java Netty Java 基礎(chǔ)

2009-08-21 17:33:34

服務(wù)器端程序C#網(wǎng)絡(luò)編程

2009-08-21 17:39:20

服務(wù)器端程序C#網(wǎng)絡(luò)編程

2010-11-02 17:01:09

DB2客戶(hù)端遠(yuǎn)程連接

2009-06-27 20:32:00

LinuxNFS客戶(hù)端

2012-07-03 13:55:00

ASP.NET

2009-08-21 14:34:34

C#服務(wù)器端表達(dá)式

2018-11-19 15:30:23

ChronyLinux命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)