淺入淺出 Server Push
推送技術(shù)Server Push的基礎(chǔ)思想是將瀏覽器主動查詢信息改為服務器主動發(fā)送信息。服務器發(fā)送一批數(shù)據(jù),瀏覽器顯示這些數(shù)據(jù),同時保證與服務器的連接。當服務器需要再次發(fā)送一批數(shù)據(jù)時,瀏覽器顯示數(shù)據(jù)并保持連接。以后,服務器仍然可以發(fā)送批量數(shù)據(jù),瀏覽器繼續(xù)顯示數(shù)據(jù),依次類推。
最近在做一個即時顯示的面板頁面。
需求:
1.即時顯示;
2.無刷新。
做Web的話,一聽到無刷新,馬上想到的就會是Ajax,我第一版的實現(xiàn)方法是Ajax的Updatepanel+Timer控件,定時向服務器發(fā)出Request。實現(xiàn)是沒有問題,但是對于資源的消耗非??植?,可以這么說。打開進程管理器,可以看到數(shù)據(jù)庫和瀏覽器(因為是在本機上做)的CPU占用比較高,并且瀏覽器的內(nèi)存占用一直在上升。。。囧——不用再多解釋了,你懂的。。。
資料到處找,各種找,從Fighting Team.SDF那里,了解到了Server Push——服務器推送技術(shù)??戳艘粌蓚€不怎么完整的Demo(網(wǎng)上這方面的資料,真不多,要不就是各種哥各種轉(zhuǎn)載的)后,開始實施。來,直接貼代碼:
這里要引入Threading的類庫:
- using System.Threading;
- ///后臺程序段:
- /// <summary>
- /// 以發(fā)送服務端控制信息的方式提供HtmlTextWriter對象
- /// </summary>
- /// <param name="writer"></param>
- protected override void Render(HtmlTextWriter writer)
- {
- base.Render(writer);
- while (Response.IsClientConnected)
- {
- Response.Write("<script>Display('" + SQLHelper.select().ToString() + "')\n </script> ");
- Response.Flush();
- Thread.Sleep(41);
- }
- }
可以看到,其實代碼非常簡單,就是重寫了Rander方法。方法里,做一個死循環(huán),將后臺數(shù)據(jù)庫里的數(shù)據(jù),不停地Response到前臺,展示給用戶。就實現(xiàn)了這么一個推送的動作。
小總結(jié)一下:這個方法因為只有一個推送,比之前用Timer定時發(fā)送Request,再接受Response的方法優(yōu)化許多,不僅減少了服務器的開銷,也降低了數(shù)據(jù)庫的負荷。再打開進程管理器看一下,CPU和內(nèi)存的占用都比較低。不過可以相對性既然存在,那么說明這個方法也有不利的一方面:ClientConnected意思是,客戶端連入,就是說客戶端沒有斷開與服務端的連接。我們知道服務器的連入數(shù)是有限制的,如果一直保持連接狀態(tài)不斷開連接的話,那么連入數(shù)一多,這個資源的消耗又是很可怕的。所以權(quán)衡完Server Push技術(shù),比較適合用在連入數(shù)少的場合,比如像信息顯示面板之類的,連入數(shù)都不較少,比較單一,則不會占用太多的資源。
【編輯推薦】