.NET基於comet伺服器推送技術(web實時聊天)
主要思想:伺服器端將資料推送到客戶端(瀏覽器)
系統簡單說明如下:
{
系統所用資料庫: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 voidSendMsg() { 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的一大優點是,每個客戶端始終都有一個向伺服器端開啟的通訊鏈路。伺服器端可以通過在事件到來時立即提交(完成)響應來把事件推給客戶端,或者它甚至可以累積再連續傳送。因為請求長時間保持開啟的狀態,故伺服器端需要特別的功能來處理所有的這些長生存期請求。