即时通讯系统中实现全局系统通知,并与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总览。    

相关文章
相关标签/搜索