1. 程式人生 > >.NET基於comet伺服器推送技術(web實時聊天)

.NET基於comet伺服器推送技術(web實時聊天)

Comet 也稱反向 Ajax 或伺服器端推技術.其思想很簡單:將資料直接從伺服器推到瀏覽器,而不必等到瀏覽器請求資料。

主要思想:伺服器端將資料推送到客戶端(瀏覽器)

系統簡單說明如下:

{

系統所用資料庫:sqlite資料庫

  UserInfo:使用者資訊表

  UserRelation:使用者關係表

  MessageInfo:聊天資訊表

開發結構:

  結構圖:

    

  三層開發:

    資料層--與sqlite資料庫之間的互動

    邏輯層--資料轉換

    實體層--資料物件

  Web服務:利用WebService對外提供公共的介面,主要提供客戶端與伺服器端資料之間的互動。

  客戶端(asp.net):利用comet中ajax反向技術推送聊天資訊。

專案操作演示效果:

  1.使用者登入(測試賬戶{liger_zql,12345},{漠然,12345})

  說明:用瀏覽器開啟兩個選項卡瀏覽Login.aspx頁面分別如下

  

  

  2.聊天介面

  登入成功後,兩選項卡分別跳轉到如下介面:雙擊線上好友中的行,則可開始進行聊天。

  liger_zql聊天介面:

  

  漠然聊天介面:

  

  其中聊天過程是使用了comet推送技術。

  3.使用者註冊介面

  

}

專案中comet推送技術

  客戶端

複製程式碼
//ajax長輪詢
function PostSubmit(params, success) {
    $.post("comet_broadcast.asyn", params,
    success, "json");
}
function Keepline() {
    
var array = new PHPArray("Keepline"); var success = function (data, status) { if (data.ResponseStatus == 1) { ShowMessage(data.ResponseData, "recive"); } Keepline(); } PostSubmit(array.ToJson(), success); }
複製程式碼

  伺服器端:

複製程式碼
    #region 傳送訊息
        private void
SendMsg() { MessageInfo message = new MessageInfo() { SendUserId = m_Context.Request["UserId"], ReciveUserId = m_Context.Request["ReciveUserId"], Content = m_Context.Request["Content"] }; //獲取伺服器端處理結果 string result = sdk.Send_Msg(message); if (dict.ContainsKey(message.ReciveUserId)) { //向對傳送資訊 dict[message.ReciveUserId].Result = result; dict[message.ReciveUserId].Send(); } //向自己傳送處理結果 _IAsyncResult.Result = result; _IAsyncResult.Send(); } #endregion
複製程式碼

其中(專案網站--WebChat_ServerPush和伺服器端處理--ServerPushHttpHandler)需要在Web.config配置檔案中做出如下配置:

<httpHandlers>
      <!--comet長連線配置位元組-->
      <add verb="*" path="comet_broadcast.asyn" type="ServerPushHttpHandler.ServerPush,ServerPushHttpHandler"/>
    </httpHandlers>

Comet是一個web應用模型,在該模型中,請求被髮送到伺服器端並保持一個很長的存活期,直到超時或是有伺服器端事件發生。在該請求完成後,另一個長生存期的Ajax請求就被送去等待另一個伺服器端事件。使用Comet的話,web伺服器就可以在無需顯式請求的情況下向客戶端傳送資料。

Comet的一大優點是,每個客戶端始終都有一個向伺服器端開啟的通訊鏈路。伺服器端可以通過在事件到來時立即提交(完成)響應來把事件推給客戶端,或者它甚至可以累積再連續傳送。因為請求長時間保持開啟的狀態,故伺服器端需要特別的功能來處理所有的這些長生存期請求。