即时通讯项目 java版本qq (含服务器和客户端)源码_即时通信系统中实现全局系统通知,并与Web后台集成【附C#开源即时通讯系统(支持广域网)——QQ高仿版IM最新源码】...

本文介绍了如何在即时通讯项目中实现全局系统通知功能,包括发送给所有用户和特定群组的通知。通过定义消息类型和协议类,客户端发送系统通知,服务端处理并广播消息,以及客户端展示通知窗口。同时,讲解了如何将此功能与Web后台集成,通过Remoting服务进行交互。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

///

///发送给所有用户的系统消息///

public const int SystemNotify4AllOnline = 80;///

///发送给某个组的系统消息///

public const int SystemNotify4Group = 81;

为了简便,我们让两个类型的消息公用同一个协议类,在GGTalk.Core项目中增加SystemNotifyContract类:

///

///系统通知的协议类。///

public classSystemNotifyContract

{public SystemNotifyContract(string title, string content, string senderID ,stringgroupID)

{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(objectsender, 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(info, 0);

GGGroup group= this.globalCache.GetGroup(contract.GroupID);if (group != null)

{foreach (string userID ingroup.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(info, 0);

SystemNotifyForm form= newSystemNotifyForm(contract.Title, contract.Content);

form.Show();return;

}

首先,将byte[]信息反序列化得到SystemNotifyContract,然后将其Title和Content交给SystemNotifyForm去显示出来。

5.与Web后台集成

很多时候,我们的管理员可能都是通过Web后台来进行系统管理,并发送系统通知的,这样,我们的GGTalk就需要与Web后台集成到一起。通常,GGTalk与Web的集成是这样做的:

96432079d8e4e8f8f4a70685018ed104.png

(1)GGTalk的服务端GGTalk.Server发布一个Remoting服务。

(2)Web通过调用GGTalk.Server的Remoting接口来完成与GGTalk的交互。

我们在GGTalk.Core项目中的IRemotingService接口中增加一个方法,用于发送系统通知:

///

///发送系统通知给所有在线用户。///

void SendSystemNotify(string title, string content);

并且,在GGTalk.Server项目的RemotingService类中,实现这个方法即可。

6.源码下载

GGTalk即时通信系统是可在广域网部署运行的C#开源即时通信系统,2013.8.7发布V1.0版本,至今最新是5.1版本,关于GG更详细的介绍以及最新源码下载,请移步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值