我潛水不少年,今天突然出現。好久沒寫過博客了,不是由於不想寫,而是由於沒有什麼感想,不知從何寫起。
前天看到一篇博文《一步一步打造本身的WEBIM》,以爲COMET這個概念頗有意思,但博主使用了本身的一套較爲複雜的框架,看起來頗爲費勁,故而我想經過簡單的jQuery+兩個類來實現一個簡單的comet模型,並附上源碼,請你們拍磚。
效果圖以下:
![](http://static.javashuo.com/static/loading.gif)
1、概念 借用橫刀天笑的解釋這個Comet概念:像彗星那樣拖着長長的尾巴的http長鏈接。事實上你們都知道,http是不能夠與服務器持久鏈接的,要是每一個請求都與服務器持久鏈接的話,那服務器早就宕掉了,就像前段時間像博客園鏈接數超過2000就出來了Service Unavailable同樣。。 就像網上的解釋: step 1.向服務器發出請求 step 2.服務器端查看是否有數據 step 3.若是有數據,則向客戶端發送數據,結束該請求,返回Step1 step 4.若是沒有數據,等待,直到有數據出現,進入step 3 經過以上幾步能夠看出,客戶端與服務器是始終維持着一個鏈接的,這樣看起來,就像客戶端與服務器端始終有一個沒有關閉的鏈接同樣。也就是他們說的"HTTP長鏈接". 2、基於ASP.NET和jQuery的Comet實現 其實jQuery只是一個手段,這裏用到它的Ajax部分,用於向服務器端發送請求。在個人源碼中,就是用於負責向服務器端發送兩個請求:一、發送數據 二、發送等待請求(當服務器有數據時該請求會返回後再次發送) 至於服務器端,如何實現判斷服務器有數據便返回,沒有數據便等待的功能呢?Google一下,能夠知道ASP.NET實現異步處理的話,實現IHttpAsyncHandler接口就能夠了。該接口的BeginProce***equest(HttpContext context, AsyncCallback cb, object extraData)方法返回一個IAsyncResult對象。當不調用其參數cb的回調函數時,該請求不會結束。 故咱們能夠在該方法中作一下文章,用一個單例模式實現的消息處理類Messages將全部請求的IAsyncResult對象保存起來,這樣即可以知道有多少個客戶端發送了請求,同時也能夠遍歷全部的IAsyncResult對象,實現向其客戶端主動發送數據的功能。 上面說了,jQuery會發送兩個請求,第二個就是一個等待請求,當服務器端主動發送了數據到客戶端時,該請求便可以收到服務器發送的數據。這樣便完成了一次服務器向客戶端主動發送數據。再次創建等待請求,重複循環,實現長鏈接。 3、源碼 我本地沒有畫圖工具,不能將以上流程用流程圖很好表示出來,請海涵。代碼也很簡單,就是一個簡單地不能再簡單的實現,有興趣的下載下來看看: /Files/hanxianlong/Comet_by_ASP.NET.rar