像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告、或是一个新闻、或是一个公告等。在这里,我们将其统称为“全局系统通知”。很多使用C#开源即时通讯系统——GGTalk的朋友都建议我加上一个类似的功能,今天,GGTalk 5.1终于实现了这一功能,并且可以通过Web后台发送全局系统通知。下面,我们将一步步讲述这一功能是如何实现的(通过类似同样的步骤,大家可以为GGTalk添加任意的自己需要的功能)。

1.定义消息类型和协议类

  我们将全局系统通知分为两类:

(1)第一种通知,是发给所有用户的。

(2)第二种通知,是发给指定群组(Group)中的用户的。

  基于此,我们需要定义两种消息类型,于是,我们在GGTalk.Core项目中的InformationTypes 类下增加两个常量:

        /// <summary>
/// 发送给所有用户的系统消息
/// </summary>
public const int SystemNotify4AllOnline = ; /// <summary>
/// 发送给某个组的系统消息
/// </summary>
public const int SystemNotify4Group = ;

  为了简便,我们让两个类型的消息公用同一个协议类,在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, );
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, );
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总览

即时通信系统中如何实现:全局系统通知,并与Web后台集成?【低调赠送:QQ高仿版GGTalk 5.1 最新源码】的更多相关文章

  1. 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】

    加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...

  2. 即时通信系统中实现全局系统通知,并与Web后台集成【附C#开源即时通讯系统(支持广域网)——QQ高仿版IM最新源码】

    像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用C#开源即时通讯系统——GGTalk的 ...

  3. 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】

    在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...

  4. 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

      (最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...

  5. 【转】可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

    原文地址:http://www.cnblogs.com/justnow/p/3382160.html (最新版本:V6.0,2017.12.11 .即将推出Xamarin移动端版本,包括 Androi ...

  6. 中秋礼物!开源即时通信GGTalk安卓版全新源码!

    经过连续两个多月的努力(开发.调试.测试.改bug),我们终于赶在中秋国庆之前能把全新的GGTalk Android版本献给大家. 4年之前我们就推出了GGTalk Android的第一个版本,但是功 ...

  7. (转)即时通讯IM OpenFire源码学习之三:在Eclipse中构建源码

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43412617 源码搭建 下载地址: 地址:http://www.igniterealti ...

  8. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

  9. 探秘Tomcat(一)——Myeclipse中导入Tomcat源码

    前言:有的时候自己不知道自己是井底之蛙,这并没有什么可怕的,因为你只要蜷缩在方寸之间的井里,无数次的生活轨迹无非最终归结还是一个圆形:但是可怕的是有一天你不得不从井里跳出来生活,需要重新审视井以外的生 ...

随机推荐

  1. 架​设​W​e​b​服​务​器

    服务器是网站的灵魂,是打开网站的必要载体.按照体系架构来区分,服务器主要分为非X86服务器.x86服务器.非X86服务器使用RISC(精简指令集)或EPIC(并行指令代码)处理器:X86服务器又称CI ...

  2. REDIS源码中一些值得学习的技术细节02

    Redis中散列函数的实现: Redis针对整数key和字符串key,采用了不同的散列函数 对于整数key,redis使用了 Thomas Wang的 32 bit Mix Function,实现了d ...

  3. Java 验证码、二维码

    Java 验证码.二维码 资源 需要:   jelly-core-1.7.0.GA.jar网站:   http://lychie.github.io/products.html将下载下来的 jelly ...

  4. 史上最全的常用iOS的第三方框架

    文章来源:http://blog.csdn.net/sky_2016/article/details/45502921 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片 ...

  5. ORACLE 10.2.01升级10.2.05 for windows 详细文档

    最近要做一个数据库的升级工作,提前在自己的PC机上练习了一下,这种文档在网上很多,但是大多都是使用命令编辑脚本,其实数据库还有一个DBUA的升级工具可以使用,使升级工作方便了很多. OS环境:wind ...

  6. Spring.Scheduling.Quartz 作业的应用(定时任务和循环触发任务)

    .定时任务的实现,比如有个任务是要晚上2点10分的时候要去触发的,先定义这个任务类RskBookFilterInitDiningService.cs,这里其实有两种实现,一种是需要继承QuartzJo ...

  7. Http协议与TCP协议简单理解(转)

    在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...

  8. 锁的封装 读写锁、lock

    最近由于项目上面建议使用读写锁,而去除常见的lock锁.然后就按照需求封装了下锁.以简化锁的使用.但是开发C#的童鞋都知道lock关键字用起太方便了,但是lock关键字不支持超时处理.很无奈,为了实现 ...

  9. 一 java线程的等待/通知模型

    java 中线程之间的通信问题,有这么一个模型:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程.前者是生产者,后者就是消费者 ...

  10. Unity3D安卓打包参数配置与兼容性的关系分析

    前言 在使用Unity3D工程导出安卓安装包的时候,往往会遇到兼容性的问题,针对某些机型,要么无法打开游戏,要么会出现卡机的现象.面对这种情况,我们可以调节相关的参数来提高兼容性. 为了了解在打包时候 ...