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

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

主要思想:服務器端將數據推送到客戶端(瀏覽器)

本人做了簡單的web實時聊天系統:服務器推送(聊天).zip

系統簡單說明如下:

{

系統所用數據庫: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的一大優點是,每個客戶端始終都有一個向服務器端打開的通信鏈路。服務器端可以通過在事件到來時立即提交(完成)響應來把事件推給客戶端,或者它甚至可以累積再連續發送。因爲請求長時間保持打開的狀態,故服務器端需要特別的功能來處理所有的這些長生存期請求。

 源碼:服務器推送(聊天).zip

轉載出處:http://www.cnblogs.com/zengqinglei

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章