即時通訊系統中實現全域性系統通知,並與Web後臺整合【附C#開源即時通訊系統(支援廣域網)——QQ高仿版IM最新原始碼】

C#開源即時通訊GGTalk發表於2016-05-30

  像QQ這樣的即時通訊軟體,時不時就會從桌面的右下角彈出一個小視窗,或是顯示一個廣告、或是一個新聞、或是一個公告等。在這裡,我們將其統稱為“全域性系統通知”。很多使用C#開源即時通訊系統——GGTalk的朋友都建議我加上一個類似的功能,今天,GGTalk 5.1終於實現了這一功能,並且可以通過Web後臺傳送全域性系統通知。下面,我們將一步步講述這一功能是如何實現的(通過類似同樣的步驟,大家可以為GGTalk新增任意的自己需要的功能)。

1.定義訊息型別和協議類

  我們將全域性系統通知分為兩類:

(1)第一種通知,是發給所有使用者的。

(2)第二種通知,是發給指定群組(Group)中的使用者的。

  基於此,我們需要定義兩種訊息型別,於是,我們在GGTalk.Core專案中的InformationTypes 類下增加兩個常量:

        /// <summary>
        /// 傳送給所有使用者的系統訊息
        /// </summary>
        public const int SystemNotify4AllOnline = 80;

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

  為了簡便,我們讓兩個型別的訊息公用同一個協議類,在GGTalk.Core專案中增加SystemNotifyContract類:

    /// <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,當點選窗體上的“傳送”按鈕時:

    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);
        }
    }

  首先,需要構造協議類例項,然後使用緊湊的序列化器將其序列化,然後通過使用者的選擇確定是全域性系統通知、還是組通知,最後使用通訊引擎將訊息其傳送給服務端。

(2)SystemNotifySendForm實現完成後,我們需要在GGTalk客戶端住窗體的底部的功能選單上新增一個“傳送系統通知”的按鈕,當點選該按鈕時,就new一個SystemNotifySendForm,並顯示出來給使用者輸入。

(3)如果需要,可以為該功能加上適當的許可權控制,比如,只有管理員帳號登入GGTalk後,才會看到“傳送系統通知”的按鈕。

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總覽。    

 

相關文章