Webserver推送技术
? server推送(Server Push)
????? 推送技術(shù)的基礎(chǔ)思想是將瀏覽器主動(dòng)查詢信息改為server主動(dòng)發(fā)送信息。server發(fā)送一批數(shù)據(jù),瀏覽器顯示這些數(shù)據(jù),同一時(shí)候保證與server的連接。當(dāng)server須要再次發(fā)送一批數(shù)據(jù)時(shí),瀏覽器顯示數(shù)據(jù)并保持連接。以后,server仍然能夠發(fā)送批量數(shù)據(jù),瀏覽器繼續(xù)顯示數(shù)據(jù),依次類推。
????? client拉曳(Client Pull)
在client拖曳技術(shù)中,server發(fā)送一批數(shù)據(jù),在HTTP響應(yīng)或文檔頭標(biāo)記中插入指令,讓瀏覽器“在5秒內(nèi)再次裝入這些數(shù)據(jù)”或“10秒內(nèi)前往某URL裝入數(shù)據(jù)”。當(dāng)指定的時(shí)間達(dá)到時(shí),client就依照server的指示去做,或者刷新當(dāng)前數(shù)據(jù),或者調(diào)入新的數(shù)據(jù)。
????? 事實(shí)上push 和 pull 這兩種技術(shù)手段很不同,但目的差點(diǎn)兒一致,都是為了給終于用戶方便的提供最新信息。
在server推送技術(shù)中,HTTP 連接一直保持著,直到server知道自己已結(jié)束發(fā)送數(shù)據(jù)并發(fā)送一個(gè)結(jié)束信號(hào),或者client中斷連接。而在client拖曳技術(shù)中,并不保持HTTP連接,相反,client被告知合時(shí)建立新連接,以及建立連接是獲取什么數(shù)據(jù)。
在server推送中,奇異之處在于“multipart/mixed”格式的MIME,它可以使一個(gè)報(bào)文(或HTTP響應(yīng))包括很多數(shù)據(jù)項(xiàng)、在client拖曳中,奇異之處在于HTTP響應(yīng)頭標(biāo)(或等效的HTML元素),它能告知client在指定的延時(shí)時(shí)間后運(yùn)行何種動(dòng)作。
????? server推送通常效率要比client拖曳效率高,由于它不必為興許數(shù)據(jù)建立新的連接。由于始終保持連接,即使沒(méi)有傳輸數(shù)據(jù)時(shí)也是這樣,因此server必須愿意分配這些TCP/IPport,對(duì)于TCP/IPport數(shù)有限的server這將是一個(gè)嚴(yán)重的問(wèn)題。
client拖曳效率低,由于這必須每次為傳送數(shù)據(jù)建立新的連接。可是它不必始終保持連接。
在實(shí)際情況中,建立HTTP連接通常須要花費(fèi)相當(dāng)多的時(shí)間,多達(dá)一秒甚至很多其它。因此從性能上考慮,server推送對(duì)于終于用戶更有吸引力,特別是對(duì)于須要常常更新信息的情況下。
server推送相對(duì)client拖曳的還有一點(diǎn)優(yōu)勢(shì)是,server推送相對(duì)照較easy控制。比如,server每一次推送時(shí)都保持一個(gè)連接,但它又隨時(shí)能夠關(guān)閉當(dāng)中的不論什么連接,而不須要在server上設(shè)置特殊的算法。而client拖曳在相同的情況下要麻煩很多,它每次要與server建立連接,server為了處理將client拖曳請(qǐng)求與特定的終于用戶匹配等情況,須要使用相當(dāng)麻煩的算法。
假設(shè)實(shí)現(xiàn)server推送的CGI程序是使用Shell腳本語(yǔ)言編寫的,有時(shí)會(huì)存在一些問(wèn)題。比如,client終于用戶中斷連接,Shell程序通常不能注意到,這將使資源毫無(wú)用處的浪費(fèi)掉,解決這一問(wèn)題的辦法是用Perl或者C來(lái)編寫這類CGI程序,以使用戶中斷連接時(shí)可以結(jié)束執(zhí)行。
????? 如上所述,在server推送中,多個(gè)響應(yīng)中連接始終保持,使server可在不論什么時(shí)間發(fā)送很多其它的數(shù)據(jù)。一個(gè)明顯的優(yōu)點(diǎn)是server全然可以控制更新數(shù)據(jù)的時(shí)間和頻率。另外,這樣的方法效率高,由于始終保持連接。缺點(diǎn)是保持連接狀態(tài)會(huì)浪費(fèi)server端的資源。server推送還比較easy中斷。
接下來(lái)就大概說(shuō)說(shuō)server推送技術(shù)?
????? server在響應(yīng)請(qǐng)求時(shí),HTTP使用MIME報(bào)文格式來(lái)封裝數(shù)據(jù)。通常一個(gè)HTTP響應(yīng)僅僅能包括一個(gè)數(shù)據(jù)塊。但MIME有一種機(jī)制可用一個(gè)報(bào)文(或HTTP響應(yīng))表示將多個(gè)數(shù)據(jù)塊,這樣的機(jī)制就是成為“multipart/mixed”的標(biāo)準(zhǔn)MIME類型。multipart/mixed報(bào)文大體格式例如以下:?
Content-type:multipart/mixed;boundary=ThisRandomString?
--ThisRandomString?
Content-type:text/plain?
第一個(gè)對(duì)象的數(shù)據(jù)。?
--ThisRandomString?
Content-type:text/plain?
第二個(gè)對(duì)象的數(shù)據(jù)。?
--ThisRandomString--
上述報(bào)文包含兩上數(shù)據(jù)塊,二者的類型都是“text/plain”。最后一個(gè)“ThisRandomString”后的兩條短線(--)表示報(bào)文結(jié)束,后面沒(méi)有數(shù)據(jù)。
對(duì)于server推送,使用一個(gè)“multipart/mixed”類型的變種--multipart/x-mixed-replace。這里,“x-”表示屬于實(shí)驗(yàn)類型?!皉eplace”表示每個(gè)新數(shù)據(jù)塊都會(huì)取代前一個(gè)數(shù)據(jù)塊。也就是說(shuō),新數(shù)據(jù)不是附加到舊數(shù)據(jù)之后,而是替代它。
以下是實(shí)際使用的“multipart/x-mixed-replace”類型:?
Content-type:multipart/x-mixed-replace;boundary=ThisRandomString?
--ThisRandomString?
Content-type:text/plain?
第一個(gè)對(duì)象的數(shù)據(jù)?
--ThisRandomString?
Content-type:text/plain?
第二個(gè)(最后一個(gè))對(duì)象的數(shù)據(jù)。?
--ThisRandomString--?
????? 使用這一技術(shù)的關(guān)鍵是,server并非推送整個(gè)“multipart/x-mixed-replace”報(bào)文,而是每次發(fā)送后數(shù)據(jù)塊。?
HTTP連接始終保持,因而server能夠按自己須要的速度和頻率推送新數(shù)據(jù),兩個(gè)數(shù)據(jù)塊之間瀏覽器僅需在當(dāng)前窗體等候,用戶甚至能夠到其它窗體做別的事情,當(dāng)server須要發(fā)送新數(shù)據(jù)時(shí),它僅僅是源(ABC輸入法沒(méi)那個(gè)字*&^$#)傳輸管道發(fā)送數(shù)據(jù)塊,client對(duì)應(yīng)的窗體進(jìn)行自我更新。
在server推送技術(shù)中,“multipart/x-mixed-replace”類型的報(bào)文由唯一的邊界線組成,這些邊界線切割每一個(gè)數(shù)據(jù)塊。每一個(gè)數(shù)據(jù)塊都有自己的頭標(biāo),因而可以指定對(duì)象相關(guān)的內(nèi)容類型和其它信息。因?yàn)椤癿ultipart/x-mixed-replace”的特性是每一新數(shù)據(jù)塊代替前一數(shù)據(jù)對(duì)象,因而瀏覽器中總是顯示最新的數(shù)據(jù)對(duì)象。?
“multipart/x-mixed-replace”報(bào)文沒(méi)有結(jié)尾。也就是說(shuō),server能夠永遠(yuǎn)保持連接,并發(fā)送所需的數(shù)據(jù)。假設(shè)用戶不再在瀏覽器窗體中顯示數(shù)據(jù)流,或者瀏覽器到server間的連接中間(比如用戶按“STOP”button),server的推送才會(huì)中斷。這是人們使用server推送的典型方式。
當(dāng)瀏覽器發(fā)現(xiàn)“Content-type”頭標(biāo)或到達(dá)頭標(biāo)結(jié)束處時(shí),瀏覽器窗體中的前一個(gè)文檔被清除,并開(kāi)始顯示下一個(gè)文檔。發(fā)現(xiàn)下一個(gè)報(bào)文邊界時(shí),就覺(jué)得當(dāng)前數(shù)據(jù)塊(文檔)已經(jīng)結(jié)束。?
總之,server推送的數(shù)據(jù)由一組頭標(biāo)(通常包含“Content-type”)、數(shù)據(jù)本身和切割符(報(bào)文邊界)三部分組成。瀏覽器看到切割符時(shí),它保持狀態(tài)不變,直到下一個(gè)數(shù)據(jù)塊到達(dá)。
將以上概念進(jìn)行用編程方法實(shí)現(xiàn),就能夠得到實(shí)際的server推送程序。比如,以下的Unix shell程序?qū)⑹篂g覽器每5秒顯示一次server上的進(jìn)程列表:?
#!/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?
????? 注意到,邊界設(shè)置在sleep語(yǔ)句之前發(fā)送,這可以確保瀏覽器清除其緩沖區(qū),并顯示所接收到的最新數(shù)據(jù)。?
NCSA HTTPD用戶在內(nèi)容類型中不能使用空格,包含邊界參數(shù)。NCSA HTTPD僅僅能將不帶空格字符的字符串作為內(nèi)容類型。假設(shè)在內(nèi)容類型行中存在空格(冒號(hào)后面的空格除外),空格后的不論什么文本都會(huì)被刪除。?
以下的演示樣例是正確的:?
Content-type: multipart/x-mixed-replace;boundary=ThisRandomString?
?????? 而下例則不能正常工作,由于它在中間有空格:?
Content-type: multipart/x-mixed-replace; boundary=ThisRandomString?
server推送的還有一個(gè)長(zhǎng)處是它能夠針對(duì)單個(gè)內(nèi)聯(lián)圖象進(jìn)行。包含圖象的文檔能夠由server定時(shí)或定周期進(jìn)行更新。而實(shí)現(xiàn)這一點(diǎn)很easy:僅僅需使IMG元素的SRC屬性指向推送一系列圖象的URL就可以。
如果server推送用于單個(gè)內(nèi)聯(lián)圖象,文檔中的圖象就會(huì)一次次被新推送來(lái)的圖象所取代,而文檔本身不需變化(如果文檔沒(méi)有進(jìn)行server推送)。這樣,WEB頁(yè)面中有限的動(dòng)畫就能夠?yàn)殪o態(tài)畫面所取代。
client拖曳
?????? client拖曳的一個(gè)簡(jiǎn)單使用方法是使文檔按固定周期自己主動(dòng)重載。比如,考慮以下的HTML文檔:?
<META HTTP-EQUIV="Refresh" CONTENT=1>?
<TITLE>Document ONE</TITLE>?
<H1>This is Document ONE!</H1>?
Here's some text.<P>?
?????? 假設(shè)將它加載支持動(dòng)態(tài)文檔的瀏覽器(Netscape 1.1以上,Internet Explorer和Mosaic也支持client拖曳),它將每隔一秒將自己重載一次。?
因?yàn)镸ETA元素實(shí)際是在HTML文檔中模擬HTTP響應(yīng)頭標(biāo),所以它可以告知瀏覽器將自身信息當(dāng)作HTTP響應(yīng)使用。上例中的META標(biāo)記相當(dāng)于:?
Refresh:1?
?????? 這樣,實(shí)際上就是HTTP頭標(biāo)告知瀏覽器每一秒更新一次文檔。假設(shè)須要延時(shí)是12秒,那么就是這種指令:?
<META HTTP-RQUIV="Refresh" CONTENT=12>?
那么它等效于:?
Refresh:12
????? 關(guān)于client的拖曳我也懶的繼續(xù)寫下去,關(guān)于怎么使client自己主動(dòng)申請(qǐng)其它URL的數(shù)據(jù)話,請(qǐng)使用例如以下:?
<META HTTP-EQUIV="Refresh" CONTENT="12;URL=http://icools.yeah.net/">?
注意的是,此處的URL不能使用相對(duì)路徑,必須所有指定。
當(dāng)中時(shí)間間隔能夠設(shè)置為0,這樣瀏覽器在當(dāng)前文檔顯示完成后,以最快的速度加載新的數(shù)據(jù)!
總結(jié)
以上是生活随笔為你收集整理的Webserver推送技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: null
- 下一篇: 软引用、弱引用、 java