標籤:style http color 使用 os 資料 art 問題
server推送(Server Push)
推送技術的基礎思想是將瀏覽器主動查詢資訊改為server主動發送資訊。server發送一批資料,瀏覽器顯示這些資料,同一時候保證與server的串連。當server須要再次發送一批資料時,瀏覽器顯示資料並保持串連。以後,server仍然能夠發送批量資料,瀏覽器繼續顯示資料,依次類推。
client拉曳(Client Pull)
在client拖曳技術中,server發送一批資料,在HTTP響應或文檔頭標記中插入指令,讓瀏覽器“在5秒內再次裝入這些資料”或“10秒內前往某URL裝入資料”。當指定的時間達到時,client就依照server的指示去做,或者重新整理當前資料,或者調入新的資料。
事實上push 和 pull 這兩種技術手段很不同,但目的差點兒一致,都是為了給終於使用者方便的提供最新資訊。
在server推送技術中,HTTP 串連一直保持著,直到server知道自己已結束髮送資料並發送一個結束訊號,或者client中斷串連。而在client拖曳技術中,並不保持HTTP串連,相反,client被告知合時建立新串連,以及建立串連是擷取什麼資料。
在server推送中,奇異之處在於“multipart/mixed”格式的MIME,它可以使一個報文(或HTTP響應)包括很多資料項目、在client拖曳中,奇異之處在於HTTP回應標頭標(或等效的HTML元素),它能告知client在指定的延時時間後運行何種動作。
server推送通常效率要比client拖曳效率高,由於它不必為興許資料建立新的串連。由於始終保持串連,即使沒有傳輸資料時也是這樣,因此server必須願意分配這些TCP/IPport,對於TCP/IPport數有限的server這將是一個嚴重的問題。
client拖曳效率低,由於這必須每次為傳送資料建立新的串連。可是它不必始終保持串連。
在實際情況中,建立HTTP串連通常須要花費相當多的時間,多達一秒甚至很多其它。因此從效能上考慮,server推送對於終於使用者更有吸引力,特別是對於須要常常更新資訊的情況下。
server推送相對client拖曳的還有一點優勢是,server推送相對照較easy控制。比如,server每一次推送時都保持一個串連,但它又隨時能夠關閉當中的不論什麼串連,而不須要在server上設定特殊的演算法。而client拖曳在相同的情況下要麻煩很多,它每次要與server建立串連,server為了處理將client拖曳請求與特定的終於使用者匹配等情況,須要使用相當麻煩的演算法。
假設實現server推送的CGI程式是使用Shell指令碼語言編寫的,有時會存在一些問題。比如,client終於使用者中斷串連,Shell程式通常不能注意到,這將使資源毫無用處的浪費掉,解決這一問題的辦法是用Perl或者C來編寫這類CGI程式,以使使用者中斷串連時可以結束執行。
如上所述,在server推送中,多個響應中串連始終保持,使server可在不論什麼時間發送很多其它的資料。一個明顯的優點是server全然可以控制更新資料的時間和頻率。另外,這樣的方法效率高,由於始終保持串連。缺點是保持串連狀態會浪費server端的資源。server推送還比較easy中斷。
接下來就大概說說server推送技術
server在響應請求時,HTTP使用MIME報文格式來封裝資料。通常一個HTTP響應僅僅能包括一個資料區塊。但MIME有一種機制可用一個報文(或HTTP響應)表示將多個資料區塊,這樣的機制就是成為“multipart/mixed”的標準MIME類型。multipart/mixed報文大體格式例如以下:
Content-type:multipart/mixed;boundary=ThisRandomString
--ThisRandomString
Content-type:text/plain
第一個對象的資料。
--ThisRandomString
Content-type:text/plain
第二個對象的資料。
--ThisRandomString--
上述報文包含兩上資料區塊,二者的類型都是“text/plain”。最後一個“ThisRandomString”後的兩條短線(--)表示報文結束,後面沒有資料。
對於server推送,使用一個“multipart/mixed”類型的變種--multipart/x-mixed-replace。這裡,“x-”表示屬於實驗類型。“replace”表示每個新資料區塊都會取代前一個資料區塊。也就是說,新資料不是附加到舊資料之後,而是替代它。
以下是實際使用的“multipart/x-mixed-replace”類型:
Content-type:multipart/x-mixed-replace;boundary=ThisRandomString
--ThisRandomString
Content-type:text/plain
第一個對象的資料
--ThisRandomString
Content-type:text/plain
第二個(最後一個)對象的資料。
--ThisRandomString--
使用這一技術的關鍵是,server並非推送整個“multipart/x-mixed-replace”報文,而是每次發送後資料區塊。
HTTP串連始終保持,因而server能夠按自己須要的速度和頻率推送新資料,兩個資料區塊之間瀏覽器僅需在當前表單等候,使用者甚至能夠到其它表單做別的事情,當server須要發送新資料時,它僅僅是源(ABCIME沒那個字*&^$#)傳輸管道發送資料區塊,client對應的表單進行自我更新。
在server推送技術中,“multipart/x-mixed-replace”類型的報文由唯一的邊界線組成,這些邊界線切割每一個資料區塊。每一個資料區塊都有自己的頭標,因而可以指定對象相關的內容類型和其它資訊。因為“multipart/x-mixed-replace”的特性是每一新資料區塊代替前一資料對象,因而瀏覽器中總是顯示最新的資料對象。
“multipart/x-mixed-replace”報文沒有結尾。也就是說,server能夠永遠保持串連,並發送所需的資料。假設使用者不再在瀏覽器表單中顯示資料流,或者瀏覽器到server間的串連中間(比如使用者按“STOP”button),server的推送才會中斷。這是人們使用server推送的典型方式。
當瀏覽器發現“Content-type”頭標或到達頭標結束處時,瀏覽器表單中的前一個文檔被清除,並開始顯示下一個文檔。發現下一個報文邊界時,就覺得當前資料區塊(文檔)已經結束。
總之,server推送的資料由一組頭標(通常包含“Content-type”)、資料本身和切割符(報文邊界)三部分組成。瀏覽器看到切割符時,它保持狀態不變,直到下一個資料區塊到達。
將以上概念進行用編程方法實現,就能夠得到實際的server推送程式。比如,以下的Unix shell程式將使瀏覽器每5秒顯示一次server上的進程列表:
#!/bin/sh
echo "HTTP/1.1 200"
echo "Content-type: multipart/x-mixed-replace;boundary=--ThisRandomString--"
echo ""
echo "--ThisRandomString--"
while true
do
echo "Content-type: text/html"
echo ""
echo "h2Processes on this machine updated every 5 seconds/h2"
echo "time:"
date
echo "p"
echo "plaintext"
ps -el
echo "--ThisRandomString--"
sleep 5
done
注意到,邊界設定在sleep語句之前發送,這可以確保瀏覽器清除其緩衝區,並顯示所接收到的最新資料。
NCSA HTTPD使用者在內容類型中不能使用空格,包含邊界參數。NCSA HTTPD僅僅能將不帶空格字元的字串作為內容類型。假設在內容類型行中存在空格(冒號後面的空格除外),空格後的不論什麼文本都會被刪除。
以下的示範範例是正確的:
Content-type: multipart/x-mixed-replace;boundary=ThisRandomString
而下例則不能正常工作,由於它在中間有空格:
Content-type: multipart/x-mixed-replace; boundary=ThisRandomString
server推送的還有一個長處是它能夠針對單個內聯圖象進行。包含圖象的文檔能夠由server定時或定周期進行更新。而實現這一點很easy:僅僅需使IMG元素的SRC屬性指向推送一系列圖象的URL就可以。
如果server推送用於單個內聯圖象,文檔中的圖象就會一次次被新推送來的圖象所取代,而文檔本身不需變化(如果文檔沒有進行server推送)。這樣,WEB頁面中有限的動畫就能夠為靜態畫面所取代。
client拖曳
client拖曳的一個簡單使用方法是使文檔按固定周期自己主動重載。比如,考慮以下的HTML文檔:
<META HTTP-EQUIV="Refresh" CONTENT=1>
<TITLE>Document ONE</TITLE>
<H1>This is Document ONE!</H1>
Here‘s some text.<P>
假設將它載入支援動態文檔的瀏覽器(Netscape 1.1以上,Internet Explorer和Mosaic也支援client拖曳),它將每隔一秒將自己重載一次。
因為META元素實際是在HTML文檔中類比HTTP回應標頭標,所以它可以告知瀏覽器將自身資訊當作HTTP響應使用。上例中的META標記相當於:
Refresh:1
這樣,實際上就是HTTP頭標告知瀏覽器每一秒更新一次文檔。假設須要延時是12秒,那麼就是這種指令:
<META HTTP-RQUIV="Refresh" CONTENT=12>
那麼它等效於:
Refresh:12
關於client的拖曳我也懶的繼續寫下去,關於怎麼使client自己主動申請其它URL的資料話,請使用例如以下:
<META HTTP-EQUIV="Refresh" CONTENT="12;URL=http://icools.yeah.net/">
注意的是,此處的URL不能使用相對路徑,必須所有指定。
當中時間間隔能夠設定為0,這樣瀏覽器在當前文檔顯示完成後,以最快的速度載入新的資料!