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的一大優點是,每個客戶端始終都有一個向服務器端打開的通信鏈路。服務器端可以通過在事件到來時立即提交(完成)響應來把事件推給客戶端,或者它甚至可以累積再連續發送。因為請求長時間保持打開的狀態,故服務器端需要特別的功能來處理所有的這些長生存期請求。
最后預祝有需要了解該技術的程序猿天天向上!!!(~ o ~)~zZ
作者:曾慶雷
出處:http://www.cnblogs.com/zengqinglei
本頁版權歸作者和博客園所有,歡迎轉載,但未經作者同意必須保留此段聲明, 且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利