基於ASP.NET的comet簡單實現

來源:互聯網
上載者:User

我潛水很多年,今天忽然出現。很久沒寫過部落格了,不是因為不想寫,而是因為沒有什麼感想,不知從何寫起。

前天看到一篇博文《一步一步打造自己的WEBIM》,覺得COMET這個概念很有意思,但博主使用了自己的一套較為複雜的架構,看起來頗為費勁,故而我想通過簡單的“jQuery+兩個類”來實現一個簡單的comet模型,並附上源碼,請大家拍磚。

如下:

 

一、概念

借用橫刀天笑的解釋這個Comet概念:“像彗星那樣拖著長長的尾巴的http長串連”。事實上大家都知道,http是不可以與伺服器持久串連的,要是每個請求都與伺服器持久串連的話,那伺服器早就宕掉了,就像前段時間像部落格園串連數超過2000就出來了Service Unavailable一樣。。

就像網上的解釋:

step 1.向伺服器發出請求

step 2.伺服器端查看是否有資料

step 3.如果有資料,則向用戶端發送資料,結束該請求,返回Step1

step 4.如果沒有資料,等待,直到有資料出現,進入step 3

通過以上幾步可以看出,用戶端與伺服器是始終維持著一個串連的,這樣看起來,就像用戶端與伺服器端始終有一個沒有關閉的串連一樣。也就是他們說的"HTTP長串連".

 

二、基於ASP.NET和jQuery的Comet實現

其實jQuery只是一個手段,這裡用到它的Ajax部分,用於向伺服器端發送請求。在我的源碼中,就是用於負責向伺服器端發送兩個請求:1、發送資料  2、發送等待請求(當伺服器有資料時該請求會返回後再次發送)

至於伺服器端,如何?判斷伺服器有資料便返回,沒有資料便等待的功能呢?Google一下,可以知道ASP.NET實現非同步處理的話,實現IHttpAsyncHandler介面就可以了。該介面的BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)方法返回一個IAsyncResult對象。當不調用其參數cb的回呼函數時,該請求不會結束。

故我們可以在該方法中做一下文章,用一個單例模式實現的訊息處理類Messages將所有請求的IAsyncResult對象儲存起來,這樣便可以知道有多少個用戶端發送了請求,同時也可以遍曆所有的IAsyncResult對象,實現向其用戶端主動發送資料的功能。

上面說了,jQuery會發送兩個請求,第二個就是一個“等待請求”,當伺服器端主動發送了資料到用戶端時,該請求便能夠收到伺服器發送的資料。這樣便完成了一次伺服器向用戶端主動發送資料。再次建立等待請求,重複迴圈,實現“長串連”。

三、源碼

我本地沒有畫圖工具,不能將以上流程用流程圖很好表示出來,請海涵。代碼也很簡單,就是一個簡單地不能再簡單的實現,有興趣的下載下來看看:

 /Files/hanxianlong/Comet_by_ASP.NET.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.