|
server-push技術(shù)已經(jīng)面世很久了,但直到GTALK的誕生才慢慢的引導(dǎo)出這項(xiàng)技術(shù),不過到現(xiàn)在為止,也很少有人去應(yīng)用這方面的技術(shù),server-push倒底是一個(gè)什么樣的東西呢?
故名思義,server-push即“服務(wù)器推”的意思,ajax大家都用過,它和server-push是完全相反的兩個(gè)東西,ajax是從服務(wù)器端拉取數(shù)據(jù),如果要定期更新頁(yè)面上顯示的數(shù)據(jù)塊,那么最簡(jiǎn)單的方法就是寫個(gè)計(jì)時(shí)器,server-push則不同,它的本質(zhì)是將client與server建立一個(gè)長(zhǎng)連接,即連上后不斷開,一旦服務(wù)器端有新的數(shù)據(jù)就將其推送到客戶端,講到這里出現(xiàn)了幾個(gè)問題。
1.ajax與server-push的區(qū)別與相同點(diǎn)分別是什么?
答:ajax與server-push的共同點(diǎn)是,它們同樣使用Javascript實(shí)現(xiàn)數(shù)據(jù)無(wú)刷新展示,區(qū)別在于,如果你使用ajax時(shí)時(shí)更新數(shù)據(jù),那么無(wú)論服務(wù)器端數(shù)據(jù)有無(wú)變化,都會(huì)定期向服務(wù)器端取數(shù)據(jù),這樣便造成了一些不必要性能消耗,對(duì)服務(wù)器造成了一定的壓力,而server-push則不同,它是在服務(wù)器端有新數(shù)據(jù)產(chǎn)生的時(shí)候才對(duì)客戶端進(jìn)行數(shù)據(jù)反饋,不過其缺點(diǎn)也產(chǎn)生于此,因?yàn)樗鼤?huì)占用WEB服務(wù)器的連接數(shù),用戶訪問量大且對(duì)連接數(shù)有一定限制的WEB服務(wù)器是不適用于server-push的。
2.服務(wù)器端如何發(fā)現(xiàn)有新數(shù)據(jù)?
答:這個(gè)問題需要根據(jù)具體應(yīng)用環(huán)境來(lái)看,如果用于“即時(shí)通訊”工具的在線用戶統(tǒng)計(jì),服務(wù)器端發(fā)現(xiàn)有新用戶登錄,即向所有客戶端推送數(shù)據(jù),還有一種用得比較多的方式是在服務(wù)器端使用多線程來(lái)監(jiān)控?cái)?shù)據(jù)的更改。
3.服務(wù)器端如何往客戶端推數(shù)據(jù)?
答:此問題是最關(guān)鍵的,服務(wù)器端怎么推送數(shù)據(jù)到客戶端呢?.NET中有個(gè)異步回調(diào),使用它便可以實(shí)現(xiàn)服務(wù)器端往客戶端數(shù)據(jù)的推送,.NET中異步回調(diào)是怎么回事呢?其實(shí)很簡(jiǎn)單.
e.g. 寫個(gè)類,假如專門用來(lái)實(shí)現(xiàn)異步回調(diào),必須注意以下幾點(diǎn)
1>繼承IHttpAsyncHandler接口 //定義 HTTP 異步處理程序?qū)ο蟊仨殞?shí)現(xiàn)的協(xié)定。
2>以下幾個(gè)方法不能少
//啟動(dòng)對(duì) HTTP 處理程序的異步調(diào)用。 public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) {} //進(jìn)程結(jié)束時(shí)提供異步處理 End 方法。 public void EndProcessRequest(IAsyncResult result){} //獲取一個(gè)值,該值指示其他請(qǐng)求是否可以使用 IHttpHandler 實(shí)例。 (繼承自 IHttpHandler。) public bool IsReusable{get { return false; ; }} //通過實(shí)現(xiàn) IHttpHandler 接口的自定義 HttpHandler 啟用 HTTP Web 請(qǐng)求的處理。 (繼承自 IHttpHandler。) public void ProcessRequest(HttpContext context){throw new NotImplementedException();} //重點(diǎn)在這里,這里負(fù)責(zé)向客戶端寫數(shù)據(jù) try { context.Response.Write(this.value); if (m_Callback != null) { m_Callback(this);//此處執(zhí)行完畢,客戶端ajax的請(qǐng)求便可獲取到服務(wù)器端推送的數(shù)據(jù)了 } } catch { } finally { m_IsCompleted = true; }
NET技術(shù):Server-push技術(shù)(comet)----------asp.net中的異步處理+client與服務(wù)器端的長(zhǎng)連接,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。