Server-push技術(comet)----------asp.net中的異步處理+client與服務器端的長連接
server-push技術已經面世很久了,但直到GTALK的誕生才慢慢的引導出這項技術,不過到現在為止,也很少有人去應用這方面的技術,server-push倒底是一個什么樣的東西呢?
故名思義,server-push即“服務器推”的意思,ajax大家都用過,它和server-push是完全相反的兩個東西,ajax是從服務器端拉取數據,如果要定期更新頁面上顯示的數據塊,那么最簡單的方法就是寫個計時器,server-push則不同,它的本質是將client與server建立一個長連接,即連上后不斷開,一旦服務器端有新的數據就將其推送到客戶端,講到這里出現了幾個問題。
1.ajax與server-push的區別與相同點分別是什么?
答:ajax與server-push的共同點是,它們同樣使用javascript實現數據無刷新展示,區別在于,如果你使用ajax時時更新數據,那么無論服務器端數據有無變化,都會定期向服務器端取數據,這樣便造成了一些不必要性能消耗,對服務器造成了一定的壓力,而server-push則不同,它是在服務器端有新數據產生的時候才對客戶端進行數據反饋,不過其缺點也產生于此,因為它會占用WEB服務器的連接數,用戶訪問量大且對連接數有一定限制的WEB服務器是不適用于server-push的。
2.服務器端如何發現有新數據?
答:這個問題需要根據具體應用環境來看,如果用于“即時通訊”工具的在線用戶統計,服務器端發現有新用戶登錄,即向所有客戶端推送數據,還有一種用得比較多的方式是在服務器端使用多線程來監控數據的更改。
3.服務器端如何往客戶端推數據?
答:此問題是最關鍵的,服務器端怎么推送數據到客戶端呢?.net中有個異步回調,使用它便可以實現服務器端往客戶端數據的推送,.net中異步回調是怎么回事呢?其實很簡單.
e.g. 寫個類,假如專門用來實現異步回調,必須注意以下幾點
1>繼承IHttpAsyncHandler接口 //定義 HTTP 異步處理程序對象必須實現的協定。
2>以下幾個方法不能少
//啟動對 HTTP 處理程序的異步調用。 public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) {} //進程結束時提供異步處理 End 方法。 public void EndProcessRequest(IAsyncResult result){} //獲取一個值,該值指示其他請求是否可以使用 IHttpHandler 實例。 (繼承自 IHttpHandler。) public bool IsReusable{get { return false; ; }} //通過實現 IHttpHandler 接口的自定義 HttpHandler 啟用 HTTP Web 請求的處理。 (繼承自 IHttpHandler。) public void ProcessRequest(HttpContext context){throw new NotImplementedException();} //重點在這里,這里負責向客戶端寫數據 try { context.Response.Write(this.value); if (m_Callback != null) { m_Callback(this);//此處執行完畢,客戶端ajax的請求便可獲取到服務器端推送的數據了 } } catch { } finally { m_IsCompleted = true; }
上面方法中的this指的是另外一個類,此類繼承接口IAsyncResult(//表示異步操作的狀態)
終上所述,server-push需要客戶端與服務器端建立一個長連接,這個長連接不能斷,這樣服務器端一旦有東西就會通過這個管道傳到客戶端,數據的push又需要使用到.net的異步回調。此處沒有涉及到具體的代碼編寫,對于沒有接觸過.net異步回調的朋友來說看起來可能有點吃力,不過首先明白原理,然后再慢慢的去摸索技術。