來源:互聯網
上載者:User
關鍵字
伺服器端
HTTP
長連接
nbsp;
dler
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 { contex t.Response.Write(this.value); if (m_Callback != null) { m_Callback(this);//此處執行完畢,用戶端ajax的請求便可獲取到伺服器端推送的資料了 } } catch { } finally { m_IsCompleted = true; }
上面方法中的this指的是另外一個類,此類繼承介面IAsyncResult(//表示非同步作業的狀態)
終上所述,server-push需要用戶端與伺服器端建立一個長連接,這個長連接不能斷,這樣伺服器端一旦有東西就會通過這個管道傳到用戶端,資料的push又需要使用到.net的非同步回檔。 此處沒有涉及到具體的代碼編寫,對於沒有接觸過.net非同步回檔的朋友來說看起來可能有點吃力,不過首先明白原理,然後再慢慢的去摸索技術。