效果圖如下:

一、概念
借用橫刀天笑的解釋這個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會發送兩個請求,第二個就是一個“等待請求”,當伺服器端主動發送了資料到用戶端時,該請求便能夠收到伺服器發送的資料。這樣便完成了一次伺服器向用戶端主動發送資料。再次建立等待請求,重複循環,實作“長連接配接”。
三、源碼
我本地沒有畫圖工具,不能将以上流程用流程圖很好表示出來,請海涵。代碼也很簡單,就是一個簡單地不能再簡單的實作,有興趣的下載下傳下來看看: