Webserver推送技術

  server推送(Server Push)html

      推送技術的基礎思想是將瀏覽器主動查詢信息改成server主動發送信息。server發送一批數據,瀏覽器顯示這些數據,同一時候保證與server的鏈接。當server需要再次發送一批數據時,瀏覽器顯示數據並保持鏈接。之後,server仍然可以發送批量數據,瀏覽器繼續顯示數據,依次類推。算法

      client拉曳(Client Pull)shell

在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在指定的延時時間後運行何種動做。dom

      server推送一般效率要比client拖曳效率高,因爲它沒必要爲興許數據創建新的鏈接。因爲始終保持鏈接,即便沒有傳輸數據時也是這樣,所以server必須願意分配這些TCP/IPport,對於TCP/IPport數有限的server這將是一個嚴重的問題。性能

client拖曳效率低,因爲這必須每次爲傳送數據創建新的鏈接。但是它沒必要始終保持鏈接。動畫

在實際狀況中,創建HTTP鏈接一般需要花費至關多的時間,多達一秒甚至不少其它。所以從性能上考慮,server推送對於終於用戶更有吸引力,特別是對於需要經常更新信息的狀況下。this

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需要發送新數據時,它僅僅是源(ABC輸入法沒那個字*&^$#)傳輸管道發送數據塊,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,這樣瀏覽器在當前文檔顯示完成後,以最快的速度加載新的數據!

相關文章
相關標籤/搜索