推送技術的基礎思想是將瀏覽器主動查詢資訊改為伺服器主動傳送資訊。伺服器傳送一批資料,瀏覽器顯示這些資料,同時保證與伺服器的連線。當伺服器需要再次傳送一批資料時,瀏覽器顯示資料並保持連線。以後,伺服器仍然可以傳送批量資料,瀏覽器繼續顯示資料,依次類推。
客戶端拉曳(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秒顯示一次伺服器上的程序列表:
注意到,邊界設定在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頁面中有限的動畫就可以為靜態畫面所代替。
伺服器推送 Server push 技術總結
1.短輪詢 ajax按一定間隔去請求 2.長輪詢 long polling long polling的實現很簡單,可分為四個過程 發起polling 發起polling很簡單,只需向伺服器發起請求,此時服務端還未應答,所以客戶端與服務端之間一直處於連線狀態。資料推送 如果伺服器端有相關資料,此時服務...
天氣推送伺服器
1 主要功能 使用者通過天氣推送伺服器暴露出來的介面進行註冊,註冊完畢之後使用者可以新增一些自己的親朋好友的資訊。每天定時爬取全國的天氣,然後推送給使用者的親朋好友。2 伺服器 伺服器使用的是乙個協程版本的web伺服器,支援get和post方法,底層用cgi方法處理帶引數的請求。伺服器對外暴露兩個介...
伺服器訊息推送
客戶端定時向伺服器傳送ajax請求,伺服器接到請求後馬上返回響應資訊並關閉連線 優點 後端程式編寫比較容易 缺點 求中有大半是無用,浪費頻寬和伺服器資源 客戶端向伺服器傳送ajax請求,伺服器接到請求後hold住連線,直到有新訊息才返回響應資訊並關閉連線,客戶端處理完響應資訊後再向伺服器傳送新的請求...