1. 程式人生 > >基於ASP.NET的comet簡單實現

基於ASP.NET的comet簡單實現

abc bject 處理 files get googl gif lba dem

前天看到一篇博文《一步一步打造自己的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

基於ASP.NET的comet簡單實現