隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          Java網(wǎng)絡編程從入門到精通(23):HTTP消息頭字段

          本文為原創(chuàng),如需轉載,請注明作者和出處,謝謝!

          上一篇:Java網(wǎng)絡編程從入門到精通(22):實現(xiàn)HTTP模擬器

          一、通用頭字段

          1. Connection

          這個字段只在HTTP1.1協(xié)議中存在。它決定了客戶端和服務器進行了一次會話后,服務器是否立即關閉網(wǎng)絡連接。在客戶端最直接的表現(xiàn)是使用read方法(readLine方法也是一樣)讀完客戶端請求的Web資源后,是否立即返回-1readLine返回null)。Connection有兩個值:CloseKeep-Alive。當使用ConnectionClose時,和HTTP1.0協(xié)議是一樣的,當read方法讀完數(shù)據(jù)時立即返回;而使用ConnectionKeep-Alive時,read方法在讀完數(shù)據(jù)后還要被阻塞一段時間。直接讀取數(shù)據(jù)超時時間過后,還繼續(xù)往下執(zhí)行。在上一篇文章中討論的readHttpResponse(...)方法實現(xiàn)的第011行可以驗證Connection的作用。下面讓我們來使用HTTP模擬器來做一個實驗。

          (1)在HTTP模擬器中輸入如下的域名:

          www.baidu.com

          (2)HTTP模擬器中輸入如下的HTTP請求信息:

          GET / HTTP/1.1   
          Host: www.baidu.com

          (3)按兩下回車(輸入一個空行)后,發(fā)送請求消息,并得到如圖1如示的HTTP響應消息頭:


          圖1

          (4)輸入yY后(在顯示http響應頭后,要立刻輸入Y或y),顯示響應消息的內(nèi)容。在顯示完內(nèi)容后,大約過了10秒鐘才進入"host:port>"提示符(因為在sendHttpRequest()的實現(xiàn)代碼中的004行設置了讀取數(shù)據(jù)超時)。

          (5)在"host:port>"提示符下直接按回車,輸入最近一次使用的域名www.baidu.com和80端口。再次輸入如下的HTTP請求:

          GET / HTTP/1.1    
          Host: www.baidu.com
          Connection: close

          輸入完以上的HTTP請求后,重新執(zhí)行第3、4步操作。最后在顯示HTTP響應消息內(nèi)容后,直接直入了"host:port>"提示符。除了這種方法,將請求的第一行改為GET / HTTP/1.0。這樣也可以無需等待直接結束。

          通過設置Connection,可以在下載Web資源(如多線程下載工具、Web瀏覽器等)后,立即斷開網(wǎng)絡連接,這樣可以有效地降低客戶機的資源消耗。

          2. Date

              這個Date頭字段描述了請求消息和響應消息被創(chuàng)建的時間。這個字段值是一個HTTP-date類型,它的格式必須是GMT(格林尼治)時間,GMT時間是就是北京時間減8小時。下面是Date字段的一個例子:

          Date: Tue, 15 Nov 2007 08:12:31 GMT

          3. Content-Length

          指定消息實體的字節(jié)數(shù)。在請求消息中POST方法必須使用Content-Length來指定請求消息的實體內(nèi)容的字節(jié)數(shù)。在響應消息中這個字段值指定了當前HTTP響應所返回的Web資源的字節(jié)數(shù)。

          二、HTTP請求消息頭字段

          1. Host

          Host字段用于指定客戶端所訪問的資源所在的主機名和端口號。如果端口號等于連接服務器時所使用的端口號,則端口號可以省略。下面是一個使用Host字段的一個例子:

          Host: www.sina.com.cn

          這個字段是必須的,如果HTTP請求不包含這個字段,服務器將返回400(Bad Request)響應狀態(tài)。

          2. Accept

          Accept字段頭確定客戶端可以接收的媒體類型。一般的格式是"*/*""類型/"子類型"。這個子段頭可以傳遞多個媒體類型,中間用","隔開。如下面是一個Accept的例子:

          Accept::image/gif,image/jpg

          如果請求頭使用上述的Accept字段值,則服務器端在動態(tài)生成網(wǎng)頁的IMG頭時將首先包含gif格式的圖像,如果gif圖象不存在,則包含jpg格式的圖象。

          3. User-Agent

          這個字段頭用于指定客戶端是用什么訪問的服務器,如果是IE6瀏覽器,并且本機安裝了.net 2.0,則User-Agent會有如下的值:

          User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; InfoPath.2)

          服務器可以通過這個字段檢查客戶機的瀏覽器版本,并根據(jù)不同的版本來確定向客戶端發(fā)送的數(shù)據(jù)。

          4. Range

               Range字段頭通過服務器只傳輸一部分Web資源。這個字段頭可以用來實現(xiàn)斷點續(xù)傳功能。有很多下載工具就是通過這個字段頭進行斷點續(xù)傳的。Range字段可以通過三種格式設置要傳輸?shù)淖止?jié)范圍:

          (1)Range: bytes=1000-2000

          傳輸范圍從10002000字節(jié)。

          (2)Range: bytes=1000-

          傳輸Web資源中第1000個字節(jié)以后的所有內(nèi)容。

          (3)Range bytes=1000

          傳輸最后1000個字節(jié)。

          三、HTTP響應消息頭字段

          1. Accept-Ranges

          這個字段說明Web服務器是否支持Range(是否支持斷點續(xù)傳功能),如果支持,則返回Accept-Ranges: bytes,如果不支持,則返回Accept-Ranges: none。

          2. Content-Range

          指定了返回的Web資源的字節(jié)范圍。這個字段值的格式是:

          開始字節(jié)位置結束字節(jié)位置/Web資源的總字節(jié)數(shù)

          下面是一個使用Content-Range的例子:

          Content-Range1000-3000/5000

          測試

          HTTP模擬器中連接服務器files.cnblogs.com,并輸入如下的HTTP請求消息:

          GET /nokiaguy/HttpSimulator.rar HTTP/1.1
          Host:
          files.cnblogs.com
          Range: bytes=1000-

              返回的響應消息頭如圖2所示:

          圖2

           從上圖可以看出,服務器files.cnblogs.com支持斷點繼傳功能。而且還可以驗證Content-Length的值是當前會話傳過來的字節(jié)數(shù),并不是Web資源的總的字節(jié)數(shù)。而Content-Range字段值中"/"后面的數(shù)才是Web資源總的字節(jié)數(shù)。

          3.  Location

          這個字段指定了上哪個新地址獲得新的Web資源。當Web資源更換URL后,而一些老用戶不能及時得知這個新的URL;因此,在老用戶訪問原來的URL時,使用Location將這個新的URL返回給客戶端。這個地址轉換對用戶來說是完全透明。

          下一篇:
          Java網(wǎng)絡編程從入門到精通(24):實現(xiàn)HTTP斷點續(xù)傳下載工具(附源代碼)





          Android開發(fā)完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-06-23 13:04 銀河使者 閱讀(3222) 評論(0)  編輯  收藏 所屬分類: java 原創(chuàng)網(wǎng)絡編程

          主站蜘蛛池模板: 喀什市| 肇州县| 绵阳市| 慈利县| 团风县| 永和县| 隆德县| 新邵县| 体育| 三穗县| 云梦县| 裕民县| 南平市| 岚皋县| 香河县| 多伦县| 云梦县| 凤庆县| 乌恰县| 商南县| 阳朔县| 黄冈市| 铜山县| 交城县| 柯坪县| 泸州市| 安图县| 门头沟区| 大埔区| 黄平县| 黑龙江省| 措美县| 峡江县| 华池县| 开阳县| 涿州市| 桃源县| 辰溪县| 赤水市| 沐川县| 马尔康县|