<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    服務器推送(Server Push)

    推送技術的基礎思想是將瀏覽器主動查詢信息改為服務器主動發送信息。服務器發送一批數據,瀏覽器顯示這些數據,同時保證與服務器的連接。當服務器需要再次發送一批數據時,瀏覽器顯示數據并保持連接。以后,服務器仍然可以發送批量數據,瀏覽器繼續顯示數據,依次類推。

    客戶端拉曳(Client Pull)

    在客戶端拖曳技術中,服務器發送一批數據,在HTTP響應或文檔頭標記中插入指令,讓瀏覽器“在5秒內再次裝入這些數據”或“10秒內前往某URL裝入數據”。當指定的時間達到時,客戶端就按照服務器的指示去做,或者刷新當前數據,或者調入新的數據。

    其實push 和 pull 這兩種技術手段非常不同,但目的幾乎一致,都是為了給最終用戶方便的提供最新信息。

    在服務器推送技術中,HTTP 連接一直保持著,直到服務器知道自己已結束發送數據并發送一個結束信號,或者客戶端中斷連接。而在客戶端拖曳技術中,并不保持HTTP連接,相反,客戶端被告知合時建立新連接,以及建立連接是獲取什么數據。

    在服務器推送中,奇妙之處在于“multipart/mixed”格式的MIME,它能夠使一個報文(或HTTP響應)包含許多數據項、在客戶端拖曳中,奇妙之處在于HTTP響應頭標(或等效的HTML元素),它能告知客戶端在指定的延時時間后執行何種動作。

    服務器推送通常效率要比客戶端拖曳效率高,因為它不必為后續數據建立新的連接。由于始終保持連接,即使沒有數據傳輸時也是這樣,因此服務器必須愿意分配這些TCP/IP端口,對于TCP/IP端口數有限的服務器這將是一個嚴重的問題。

    客戶端拖曳效率低,因為這必須每次為傳送數據建立新的連接。但是它不必始終保持連接。

    在實際情況中,建立HTTP連接通常需要花費相當多的時間,多達一秒甚至更多。因此從性能上考慮,服務器推送對于最終用戶更有吸引力,特別是對于需要經常更新信息的情況下。

    服務器推送相對客戶端拖曳的另一點優勢是,服務器推送相對比較容易控制。例如,服務器每一次推送時都保持一個連接,但它又隨時可以關閉其中的任何連接,而不需要在服務器上設置特殊的算法。而客戶端拖曳在同樣的情況下要麻煩許多,它每次要與服務器建立連接,服務器為了處理將客戶端拖曳請求與特定的最終用戶匹配等情況,需要使用相當麻煩的算法。

    如果實現服務器推送的CGI程序是使用Shell腳本語言編寫的,有時會存在一些問題。例如,客戶端最終用戶中斷連接,Shell程序通常不能注意到,這將使資源毫無用處的浪費掉,解決這一問題的辦法是用Perl或者C來編寫這類CGI程序,以使用戶中斷連接時能夠結束運行。


    如上所述,在服務器推送中,多個響應中連接始終保持,使服務器可在任何時間發送更多的數據。一個明顯的好處是服務器完全能夠控制更新數據的時間和頻率。另外,這種方法效率高,因為始終保持連接。缺點是保持連接狀態會浪費服務器端的資源。服務器推送還比較容易中斷。

    接下來就大概說說服務器推送技術
    服務器在響應請求時,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”后的兩條短線(--)表示報文結束,后面沒有數據。

    對于服務器推送,使用一個“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--
    使用這一技術的關鍵是,服務器并不是推送整個“multipart/x-mixed-replace”報文,而是每次發送后數據塊。
    HTTP連接始終保持,因而服務器可以按自己需要的速度和頻率推送新數據,兩個數據塊之間瀏覽器僅需在當前窗口等候,用戶甚至可以到其他窗口做別的事情,當服務器需要發送新數據時,它只是源(ABC輸入法沒那個字*&^$#)傳輸管道發送數據塊,客戶端相應的窗口進行自我更新。

    在服務器推送技術中,“multipart/x-mixed-replace”類型的報文由唯一的邊界線組成,這些邊界線分割每個數據塊。每個數據塊都有自己的頭標,因而能夠指定對象相關的內容類型和其他信息。由于“multipart/x-mixed-replace”的特性是每一新數據塊取代前一數據對象,因而瀏覽器中總是顯示最新的數據對象。
    “multipart/x-mixed-replace”報文沒有結尾。也就是說,服務器可以永遠保持連接,并發送所需的數據。如果用戶不再在瀏覽器窗口中顯示數據流,或者瀏覽器到服務器間的連接中間(例如用戶按“STOP”按鈕),服務器的推送才會中斷。這是人們使用服務器推送的典型方式。

    當瀏覽器發現“Content-type”頭標或到達頭標結束處時,瀏覽器窗口中的前一個文檔被清除,并開始顯示下一個文檔。發現下一個報文邊界時,就認為當前數據塊(文檔)已經結束。
    總之,服務器推送的數據由一組頭標(通常包括“Content-type”)、數據本身和分割符(報文邊界)三部分組成。瀏覽器看到分割符時,它保持狀態不變,直到下一個數據塊到達。

    將以上概念進行用編程方法實現,就可以得到實際的服務器推送程序。例如,下面的Unix shell程序將使瀏覽器每5秒顯示一次服務器上的進程列表:
    #!/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
    服務器推送的另一個優點是它可以針對單個內聯圖象進行。包括圖象的文檔可以由服務器定時或定周期進行更新。而實現這一點非常簡單:只需使IMG元素的SRC屬性指向推送一系列圖象的URL即可。

    如果服務器推送用于單個內聯圖象,文檔中的圖象就會一次次被新推送來的圖象所代替,而文檔本身不需變化(假設文檔沒有進行服務器推送)。這樣,WEB頁面中有限的動畫就可以為靜態畫面所代替。

    客戶端拖曳

    客戶端拖曳的一個簡單用法是使文檔按固定周期自動重載。例如,考慮下面的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也支持客戶端拖曳),它將每隔一秒將自己重載一次。
    由于META元素實際是在HTML文檔中模擬HTTP響應頭標,所以它能夠告知瀏覽器將自身信息當作HTTP響應使用。上例中的META標記相當于:
    Refresh:1
    這樣,實際上就是HTTP頭標告知瀏覽器每一秒更新一次文檔。如果需要延時是12秒,那么就是這樣的指令:
    <META HTTP-RQUIV="Refresh" CONTENT=12>
    那么它等效于:
    Refresh:12

    關于客戶端的拖曳我也懶的繼續寫下去,關于怎么使客戶端自動申請其他URL的數據話,請使用如下:
    <META HTTP-EQUIV="Refresh" CONTENT="12;URL=http://icools.yeah.net/">
    注意的是,此處的URL不能使用相對路徑,必須全部指定。

    其中時間間隔可以設置為0,這樣瀏覽器在當前文檔顯示完畢后,以最快的速度載入新的數據!
    ?

    返回
    ??

    ??? IT315發表的文檔,均來自于相關網站公開發表的內容,如果您認為本站發表的文章侵犯了您的著作權,請及時與本站取得聯系,本站將在第一時間內刪除。如果您有好的文章也可以通過Email提供給我們,如果有問題可以在留言板提出。
    posted on 2006-09-14 19:16 pear 閱讀(399) 評論(0)  編輯  收藏 所屬分類: 摘引
     
    主站蜘蛛池模板: 中国极品美軳免费观看| 小说区亚洲自拍另类| 免费国产在线视频| 亚洲永久无码3D动漫一区| 美女黄频a美女大全免费皮| 国产美女精品久久久久久久免费| 77777亚洲午夜久久多喷| 无码国产精品久久一区免费 | 亚洲精品影院久久久久久| 免费视频成人手机在线观看网址| 国产亚洲精品a在线无码| a级男女仿爱免费视频| 亚洲s色大片在线观看| 99视频有精品视频免费观看| 精品亚洲麻豆1区2区3区| 免费国产作爱视频网站| 最新亚洲春色Av无码专区| 四虎影永久在线高清免费 | 国产精品美女久久久免费| 亚洲香蕉网久久综合影视| 香港a毛片免费观看| 久久精品国产亚洲AV久| 国产美女无遮挡免费视频网站| h在线看免费视频网站男男| 亚洲成Av人片乱码色午夜| 免费一区二区视频| 尤物视频在线免费观看| 亚洲成人免费在线| 久久精品a一国产成人免费网站| 亚洲AV无码一区二区一二区| 国产精品亚洲二区在线观看| 久久国产精品国产自线拍免费| 亚洲狠狠狠一区二区三区| 青青草国产免费久久久下载| 国产乱子伦精品免费视频| 2022年亚洲午夜一区二区福利| 四虎影院免费在线播放| 东北美女野外bbwbbw免费 | 亚洲精品综合久久中文字幕| 成年人在线免费看视频| 国产无限免费观看黄网站|