淺入淺出 Server Push
推送技術Server Push的基礎思想是將瀏覽器主動查詢信息改為服務器主動發送信息。服務器發送一批數據,瀏覽器顯示這些數據,同時保證與服務器的連接。當服務器需要再次發送一批數據時,瀏覽器顯示數據并保持連接。以后,服務器仍然可以發送批量數據,瀏覽器繼續顯示數據,依次類推。
最近在做一個即時顯示的面板頁面。
需求:
1.即時顯示;
2.無刷新。
做Web的話,一聽到無刷新,馬上想到的就會是Ajax,我第一版的實現方法是Ajax的Updatepanel+Timer控件,定時向服務器發出Request。實現是沒有問題,但是對于資源的消耗非常恐怖,可以這么說。打開進程管理器,可以看到數據庫和瀏覽器(因為是在本機上做)的CPU占用比較高,并且瀏覽器的內存占用一直在上升。。。囧——不用再多解釋了,你懂的。。。
資料到處找,各種找,從Fighting Team.SDF那里,了解到了Server Push——服務器推送技術。看了一兩個不怎么完整的Demo(網上這方面的資料,真不多,要不就是各種哥各種轉載的)后,開始實施。來,直接貼代碼:
這里要引入Threading的類庫:
- using System.Threading;
- ///后臺程序段:
- /// <summary>
- /// 以發送服務端控制信息的方式提供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方法。方法里,做一個死循環,將后臺數據庫里的數據,不停地Response到前臺,展示給用戶。就實現了這么一個推送的動作。
小總結一下:這個方法因為只有一個推送,比之前用Timer定時發送Request,再接受Response的方法優化許多,不僅減少了服務器的開銷,也降低了數據庫的負荷。再打開進程管理器看一下,CPU和內存的占用都比較低。不過可以相對性既然存在,那么說明這個方法也有不利的一方面:ClientConnected意思是,客戶端連入,就是說客戶端沒有斷開與服務端的連接。我們知道服務器的連入數是有限制的,如果一直保持連接狀態不斷開連接的話,那么連入數一多,這個資源的消耗又是很可怕的。所以權衡完Server Push技術,比較適合用在連入數少的場合,比如像信息顯示面板之類的,連入數都不較少,比較單一,則不會占用太多的資源。
【編輯推薦】