即時通訊系統中實現全局系統通知,並與Web後臺集成【附C#開源即時通信系統(支持廣域網)——QQ高仿版IM最新源碼】

  像QQ這樣的即時通訊軟件,時不時就會從桌面的右下角彈出一個小窗口,或是顯示一個廣告、或是一個新聞、或是一個公告等。在這裏,咱們將其統稱爲「全局系統通知」。不少使用C#開源即時通信系統——GGTalk的朋友都建議我加上一個相似的功能,今天,GGTalk 5.1終於實現了這一功能,而且能夠經過Web後臺發送全局系統通知。下面,咱們將一步步講述這一功能是如何實現的(經過相似一樣的步驟,你們能夠爲GGTalk添加任意的本身須要的功能)。html

1.定義消息類型和協議類

  咱們將全局系統通知分爲兩類:api

(1)第一種通知,是發給全部用戶的。緩存

(2)第二種通知,是發給指定羣組(Group)中的用戶的。併發

  基於此,咱們須要定義兩種消息類型,因而,咱們在GGTalk.Core項目中的InformationTypes 類下增長兩個常量:post

        /// <summary>
        /// 發送給全部用戶的系統消息
        /// </summary>
        public const int SystemNotify4AllOnline = 80;

        /// <summary>
        /// 發送給某個組的系統消息
        /// </summary>
        public const int SystemNotify4Group = 81;      

  爲了簡便,咱們讓兩個類型的消息公用同一個協議類,在GGTalk.Core項目中增長SystemNotifyContract類:this

    /// <summary>
    /// 系統通知的協議類。
    /// </summary>
    public class SystemNotifyContract
    {
     public SystemNotifyContract(string title, string content, string senderID ,string groupID) { this.Title = title; this.Content = content; this.SenderID = senderID; this.GroupID = groupID; } public string Title { get; set; } public string Content { get; set; } public string SenderID { get; set; } public string GroupID { get; set; } }

2.客戶端發送系統通知

(1)咱們須要定義用於輸入系統通知的標題和內容的窗體,具體可參見GGTalk即時通信系統項目源碼下的SystemNotifySendForm,當點擊窗體上的「發送」按鈕時:url

    private void btnSend_Click(object sender, EventArgs e)
    {
        try
        {
            SystemNotifyContract contract = new SystemNotifyContract(this.skinTextBox_id.Text, this.richTextBox1.Text, this.rapidPassiveEngine.CurrentUserID, this.skinTextBox_groupID.Text);
            byte[] data = CompactPropertySerializer.Default.Serialize(contract);
            int infoType = this.skinRadioButton_group.Checked ? InformationTypes.SystemNotify4Group : InformationTypes.SystemNotify4AllOnline;
            this.rapidPassiveEngine.CustomizeOutter.Send(infoType, data);
            MessageBox.Show("發送成功!");
            this.Close();
        }
        catch (Exception ee)
        {
            MessageBox.Show("發送失敗!" + ee.Message);
        }
    }

  首先,須要構造協議類實例,而後使用緊湊的序列化器將其序列化,而後經過用戶的選擇肯定是全局系統通知、仍是組通知,最後使用通訊引擎將消息其發送給服務端。spa

(2)SystemNotifySendForm實現完成後,咱們須要在GGTalk客戶端住窗體的底部的功能菜單上添加一個「發送系統通知」的按鈕,當點擊該按鈕時,就new一個SystemNotifySendForm,並顯示出來給用戶輸入。code

(3)若是須要,能夠爲該功能加上適當的權限控制,好比,只有管理員賬號登陸GGTalk後,纔會看到「發送系統通知」的按鈕。orm

3.服務端處理

  當服務端收到來自客戶端的全局系統通知消息時,須要將其廣播出去:

(1)若是是全局系統通知(SystemNotify4AllOnline ),則將其發送給全部在線的用戶。

(2)若是是羣組系統通知(SystemNotify4Group),則將其發送給該組的全部成員。

  下面是處理SystemNotify4Group類型消息的代碼(在GGTalk.Server項目的CustomizeHandler類中):

    if (informationType == InformationTypes.SystemNotify4Group)
    {
        SystemNotifyContract contract = CompactPropertySerializer.Default.Deserialize<SystemNotifyContract>(info, 0);
        GGGroup group = this.globalCache.GetGroup(contract.GroupID);
        if (group != null)
        {
            foreach (string userID in group.MemberList)
            {
                this.rapidServerEngine.CustomizeController.Send(userID, InformationTypes.SystemNotify4Group, info);
            }
        }        
    }

  首先,須要反序列化獲得SystemNotifyContract實例,而後拿到該實例中的GroupID的值,而後根據GroupID從緩存獲取該組的全部成員列表,最後,將系統通知轉發給全部這些成員。

4.客戶端顯示系統通知

  當任何一個在線的GGTalk客戶端收到系統通知消息時,就會像QQ同樣在屏幕的右下角彈出一個小窗口,來顯示系統通知的具體內容。

(1)咱們在GGTalk項目中增長一個SystemNotifyForm,用於顯示系統通知的信息。

(2)在客戶端的信息處理器中(在 MainFormPartial.cs 文件中),增長對SystemNotify4AllOnline 和 SystemNotify4Group消息的處理:

    if (informationType == InformationTypes.SystemNotify4Group)
    {
        SystemNotifyContract contract = CompactPropertySerializer.Default.Deserialize<SystemNotifyContract>(info, 0);
        SystemNotifyForm form = new SystemNotifyForm(contract.Title, contract.Content);
        form.Show();
        return;
    }

  首先,將byte[]信息反序列化獲得SystemNotifyContract,而後將其Title和Content交給SystemNotifyForm去顯示出來。

5.與Web後臺集成

  不少時候,咱們的管理員可能都是經過Web後臺來進行系統管理,併發送系統通知的,這樣,咱們的GGTalk就須要與Web後臺集成到一塊兒。一般,GGTalk與Web的集成是這樣作的:

    

(1)GGTalk的服務端GGTalk.Server發佈一個Remoting服務。

(2)Web經過調用GGTalk.Server的Remoting接口來完成與GGTalk的交互。

  咱們在GGTalk.Core項目中的IRemotingService接口中增長一個方法,用於發送系統通知:

    /// <summary>
    /// 發送系統通知給全部在線用戶。
    /// </summary>      
    void SendSystemNotify(string title, string content);

  而且,在GGTalk.Server項目的RemotingService類中,實現這個方法便可。 

6.源碼下載

       GGTalk即時通訊系統是可在廣域網部署運行的C#開源即時通訊系統,2013.8.7發佈V1.0版本,至今最新是5.1版本,關於GG更詳細的介紹以及最新源碼下載,請移步 可在廣域網部署運行的C#開源即時通訊系統 -- GGTalk總覽。    

相關文章
相關標籤/搜索