聊天系統Demo,增長Silverlight客戶端(附源碼)-- ESFramework 4.0 快速上手(09)

 在ESFramework 4.0 快速上手 -- 入門Demo,一個簡單的IM系統(附源碼)一文中,咱們介紹了使用ESFramework的Rapid引擎開發的winform聊天程序,本文咱們將在以前demo的基礎上添加使用ESFramework.SL開發的Silverlight客戶端。這樣一來,不只Silverlight客戶端之間能夠相互通訊,Silverlight客戶端還能夠跟winform客戶端進行通訊。若是不瞭解在Silverlight中如何使用ESFramework,能夠先看看ESFramework 4.0 快速上手 -- 在Silverlight中使用ESFrameworkhtml

      Silverlight客戶端一樣實現瞭如下功能並有所加強:api

(1)客戶端用戶上下線時,通知其餘在線用戶。服務器

(2)當客戶端與服務端網絡斷開時,進行自動重連,當網絡恢復後,重連成功。網絡

(3)全部在線用戶(包括Winform客戶端)之間能夠進行文字聊天。工具

(4)消息同步調用。(演示了三種類型的同步調用)post

(5)重登錄模式。當同名的用戶登錄時,會把前面的用戶擠掉。spa

 

一.服務端code

      服務端直接使用ESFramework 4.0 快速上手 -- 入門Demo,一個簡單的IM系統(附源碼的實現,而且增長了服務器同步調用客戶端的功能 -- 即服務端向某個在線客戶端提交請求並返回客戶端的回覆信息。咱們利用了服務端UI的「工具」菜單裏面「自定義功能」,當點擊這個菜單時,將默認向在線用戶列表中的第一個用戶發送同步調用請求。如圖中第一個在線用戶是aa01,那麼點擊「自定義功能」後,就由aa01來處理服務端的同步調用。orm

      

      服務端同步調用客戶端由ICustomizeInfoController.QueryClient()方法來實現。 htm

複製代碼
        /// <summary>
        /// 詢問在線客戶端,並返回應答信息。若是目標用戶不在線,或超時沒有應答則將拋出Timeout異常。
        /// </summary>      
        /// <param name="userID">接收並處理服務器詢問的目標用戶ID</param>
        /// <param name="informationType">自定義請求信息的類型</param>
        /// <param name="info">請求信息</param>
        /// <returns>客戶端給出的應答信息</returns>
        byte[] QueryClient(string userID, int informationType, byte[] info);
複製代碼

 


二.客戶端

1.客戶端的MainPage類實現了ESFramework.SL.Application.Basic.IBasicBusinessHandler接口,以接收其餘用戶的上下線通知、被擠掉線通知、心跳超時通知等。

2.客戶端的MainPage類還實現了ESFramework.SL.Application.CustomizeInfo.ICustomizeInfoBusinessHandler接口,以處理來自其它用戶的聊天消息、來自服務端的同步調用、以及來自其它客戶端的P2P同步調用等。

3.客戶端的MainPage類還預約並處理了ESFramework.SL.Rapid.IRapidPassiveEngine的TcpPassiveEngine屬性的與鏈接狀態變化相關的事件,如鏈接斷開、重連開始、重連成功/失敗。 

      客戶端啓動登錄後,顯示的主界面MainPage以下:

    
  當有其餘用戶登錄時,會在「在線用戶列表」中顯示出來,點擊選擇用戶ID,就能夠與該用戶聊天。UI右邊上面是與所選擇的用戶的聊天曆史記錄,下面是發送消息的文本框。 從在線用戶列表選擇要對話的好友,而後在聊天輸入框輸入文本,最後點擊「發送」按鈕便可。程序經過ESFramework.SL.Application.CustomizeInfo.ICustomizeInfoOutter的Send方法發送消息給好友。

   void Send(string targetUserID, int informationType, byte[] info);

      好友掉線時,好友的名稱會從好友列表中消失,若是正在與該好友聊天,則右邊的歷史記錄會清空,「發送」按鈕也再也不可用。 

  若是咱們在另外一個地方再登錄一個aa01(演示重登錄),程序會先回調ESFramework.SL.Application.Basic.IBasicBusinessHandler的OnBeingPushedOut(),而後再觸發TcpPassiveEngine的ConnectionInterrupted事件,通知當前的用戶。

  

 3、同步調用

    這個demo裏面演示了三種類型的同步調用:客戶端與客戶端之間的同步調用,客戶端同步調用服務端,服務端同步調用客戶端。

    1.客戶端同步調用服務端:這個在前一個Demo中演示過,在Sliverlight客戶端中徹底使用同樣的模式。

 

    2. 服務端同步調用客戶端:這個在第一部分已經介紹,而客戶端是經過實現ICustomizeInfoBusinessHandler接口的HandleQueryFromServer方法來處理來自服務端的同步調用的:

複製代碼
        /// <summary>
        /// 處理來自服務端的詢問信息,並給出應答信息。(即處理服務端ICustomizeInfoController.QueryClient發出的請求)
        /// </summary>    
        /// <param name="informationType">自定義信息類型</param>
        /// <param name="info">二進制信息</param>
        /// <returns>應答信息</returns>
        byte[] HandleQueryFromServer(int informationType, byte[] info);    
複製代碼

 

    3. 客戶端同步調用客戶端:調用是由ICustomizeInfoOutter接口的CommitP2PRequest方法來發出的,

複製代碼
        /// <summary>
        /// 向在線目標用戶提交請求信息,並返回應答信息。若是目標用戶不在線,或超時沒有應答則將拋出Timeout異常。
        /// </summary>      
        /// <param name="targetUserID">接收並處理請求消息的目標用戶ID</param>
        /// <param name="requestInfoType">自定義請求信息的類型</param>
        /// <param name="requestInfo">請求信息</param>
        /// <returns>應答信息</returns>
        byte[] CommitP2PRequest(string targetUserID, int requestInfoType, byte[] requestInfo);
複製代碼

      目標客戶端收到來自其餘用戶的同步調用請求後,會由ICustomizeInfoBusinessHandler接口的HandleP2PRequest方法來處理這個請求:

        byte[] HandleP2PRequest(string sourceUserID, int requestInfoType, byte[] requestInfo);

 

四. 兩種類型的客戶端公用同一服務端

      基於ESFramework Rapid引擎開發的winform客戶端和silverlight客戶端能夠公用同一個服務端,甚至之後,ESFramework還可能支持基於C++/Flash/Java的客戶端。下圖是本文的Demo啓動後,silverlight客戶端和winform客戶端用戶以前的通訊截圖。

        

 

 

五.Demo源碼下載

     下載本文的Demo源碼。注意,在運行基於Silverlight的客戶端程序時,服務器上首先應該起到「Silverlight策略服務器」,能夠從ESFramework 4.0 概述文末下載策略服務器。

相關文章
相關標籤/搜索