`
feipigwang
  • 浏览: 743809 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ESFramework介绍之(27)-- 支持OverdueMessage

 
阅读更多

(本文适用于ESFramework V0.2+)
QQ上,你给好友发消息,如果对方不在线,则服务器会把这个消息持久化存起来,等好友下次上线时,再转发给他。像这样的消息在ESFramework中称为OverdueMessage。显然,MSN没有支持OverdueMessage。当然了,ESFramework中的OverdueMessage不仅仅是文字消息,而是可以为任何类型的消息,比如,音频、视频、文件等等。

ESFramework中对所有P2P的消息的处理都是由P2PMessageDealer完成的,当P2PMessageDealer转发一个消息时,发现目标用户不在线,就会将这个消息交给一个称为IOverdueMessageHandler的组件处理,IOverdueMessageHandler组件可以持久化存储这个消息,也可以直接将其保存在内存中,具体采用哪种方式,取决于你的应用。
IOverdueMessageHandler组件有如下职责:
(1)保存(或持久化)存储OverdueMessage
(2)提取指定目标用户的所有OverdueMessage
(3)当OverdueMessage成功发送给目标用户后,改变OverdueMessage的状态或删除这些OverdueMessage。

基于此,IOverdueMessageHandler接口设计如下:

publicinterfaceIOverdueMessageHandler
{
boolEnabled{set;}
voidHandleOverdueP2PMessage(NetMessagerevMsg);
IListPickupOverdueP2PMessage(stringdestUserID);//列表中为NetMessage元素
voidSetOverdueMessageSended(stringdestUserID);
}

对应的类图:

IOverdueMessageHandler由应用实现,因为只有你的应用需求才能决定处理OverdueMessage的物理方式。P2PMessageDealer的实现中引入了IOverdueMessageHandler,如下:

intresult=this.toClientSender.HookAndSendMessage(reqMsg.Header.DestUserID,reqMsg);
if(result!=DataSendResult.Succeed)//处理没有发送成功的消息
{
if(this.overdueMessageHandler!=null)
{
this.overdueMessageHandler.HandleOverdueP2PMessage(reqMsg);
}
}
//

我们需要另外一个组件来负责发送OverdueMessage给目标用户,那就是OverdueMessageSender,它可以让你指定在多久之后发送OverdueMessage给指定的用户,如果没有指定这个时间间隔,就立即发送。

OverdueMessageSender
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> publicclassOverdueMessageSender
{
#regionproperty
#regionToClientSender
privateIToClientSendertoClientSender=null;
publicIToClientSenderToClientSender
{
set
{
this.toClientSender=value;
}
}
#endregion

#regionOverdueMessageHandler
privateIOverdueMessageHandleroverdueMessageHandler=null;
publicIOverdueMessageHandlerOverdueMessageHandler
{
set
{
this.overdueMessageHandler=value;
}
}
#endregion

#regionSendDelay
privateintsendDelay=0;//ms
publicintSendDelay
{
set
{
this.sendDelay=value;
}
}
#endregion

#regionEsbLogger
privateIEsbLoggeresbLogger=null;
publicIEsbLoggerEsbLogger
{
set
{
this.esbLogger=value;
}
}
#endregion
#endregion

publicOverdueMessageSender()
{
}

publicvoidSendOverdueMessage(stringuserID)
{
IListlist
=this.overdueMessageHandler.PickupOverdueP2PMessage(userID);
if(list==null)
{
return;
}

if(this.sendDelay<=0)
{
this.DoSend(list,userID);
}
else
{
CbDoSendcb
=newCbDoSend(this.DoSend);
cb.BeginInvoke(list,userID,
null,null);
}
}

#regionDoSend
privatevoidDoSend(IListmsgList,stringuserID)
{
try
{
if(this.sendDelay>0)
{
System.Threading.Thread.Sleep(
this.sendDelay);
}

foreach(NetMessagemsginmsgList)
{
intresult=this.toClientSender.HookAndSendMessage(userID,msg);
if(result!=DataSendResult.Succeed)
{
return;
}
}

this.overdueMessageHandler.SetOverdueMessageSended(userID);
}
catch(Exceptionee)
{
this.esbLogger.Log(ee.GetType().ToString(),ee.Message,"ESFramework.Network.OverdueP2PMessageSender.DoSend",ErrorLevel.Standard);
}
}
#endregion
}

internaldelegatevoidCbDoSend(IListmsgList,stringuserID);

注意,OverdueMessageSender借助OverdueMessageHandler来取出指定目标用户的OverdueMessage,并借助IToClientSender组件来发送这些OverdueMessage,最后,当发送成功,就调用OverdueMessageHandler的SetOverdueMessageSended方法。

很多应用都要求在目标用户登录时,将属于他的OverdueMessage发送给它,这个时机可以从IBasicRequestDealer组件的SomeOneLogon事件切入,ESFramework对这一常见需求进行了支持,那就是OverdueMessageBridge。OverdueMessageBridge将OverdueMessageSender链接到这一时机。

publicclassOverdueMessageBridge
{

#regionBasicRequestDealer
publicIBasicRequestDealerBasicRequestDealer
{
set
{
if(value!=null)
{
value.SomeOneLogon
+=newCbLogon(value_SomeOneLogon);
}
}
}
#endregion

#regionOverdueMessageSender
privateOverdueMessageSenderoverdueMessageSender=null;
publicOverdueMessageSenderOverdueMessageSender
{
set
{
this.overdueMessageSender=value;
}
}
#endregion

publicOverdueMessageBridge()
{
}

privatevoidvalue_SomeOneLogon(stringuserID,NetMessagelogonMsg)
{
this.overdueMessageSender.SendOverdueMessage(userID);
}
}

如果你需要在其它时刻来发送OverdueMessage,自己构造一个对应的Bridge即可。

细心的朋友可能会问,如果使用了Hook,那么Hook会不会对IOverdueMessageHandler.PickupOverdueP2PMessage()取出的消息产生影响?答案是不会。因为OverdueMessageSender采用的是和P2PMessageDealer一样的方式来发送OverdueMessage,所以如果存在Hook,OverdueMessage也会经过相同的Hook处理。

(ESFramework V0.2 将会在五一假期后上载)

感谢关注!

上一篇文章:ESFramework介绍之(26)-- 支持复杂插件(InnerDealer 和 InnerDispatcher)

转到:ESFramework 可复用的通信框架(序)







分享到:
评论

相关推荐

    ESFramwork2.0

    日志记录IEsbLogger &lt;br&gt;12.ESFramework介绍之(26)-- 支持复杂插件(InnerDealer 和 InnerDispatcher) &lt;br&gt;13.ESFramework介绍之(27)-- 支持OverdueMessage &lt;br&gt;14.ESFramework介绍之(29)―...

    ESFramework系列Demo源码

    本demo是在1.ESFramework之入门Demo的基础之上,增加了客户端之间传送文件(夹)的功能,并可以演示文件传送中断通知、断点续传等特性。 3.ESFramework之P2P通信Demo 本demo是在2.ESFramework之文件传送Demo的基础...

    ESFramework

    ESFramework ESFramework ESFramework

    ESFramework之入门Demo.rar

    本demo是一个简单的IM程序,展示了Rapid引擎最基础的功能:信息类型定义、协议定义、信息发送与处理、信息同步调用、好友上下线通知、断线重连等

    PHP实例开发源码-ESFramework之P2P通信Demo php版.zip

    PHP实例开发源码—ESFramework之P2P通信Demo php版.zip PHP实例开发源码—ESFramework之P2P通信Demo php版.zip PHP实例开发源码—ESFramework之P2P通信Demo php版.zip

    ESFramework .net框架

    ESFramework的前生是EnterpriseServerBase类库,后来我将EnterpriseServerBase中的Network部分及建立于之上的应用抽象重新整理为ESFramework框架,这是一套完全可复用的、灵活的、单纯的、支持N层C/S架构的轻量级...

    ESFramework网络通信框架

    这是一套完全可复用的、灵活...ESFramework不仅仅提供了一个基础的C/S框架和大量C/S应用中常用的组件,而且在ESFramework框架之上,引入的一个扩展层--ESFramework扩展层,专门用于解决的与具体应用相关的领域问题。

    PHP实例开发源码-ESFramework之文件传送Demo.zip

    PHP实例开发源码—ESFramework之文件传送Demo.zip PHP实例开发源码—ESFramework之文件传送Demo.zip PHP实例开发源码—ESFramework之文件传送Demo.zip

    ESFramework之文件传送Demov1.0

    本demo是在ESFramework.Demos.Simplest的基础之上,增加了客户端之间传送文件(夹)的功能,并可以演示文件传送中断通知、断点续传等特性。

    ESFramework之P2P通信Demo.rar

    本demo是在ESFramework.Demos.FileTransfer的基础之上,增加了P2P通信的功能。客户端之间如果P2P通道创建成功,则它们之间的消息将直接使用P2P通道传送。

    ESFramework网络链接库

    ESFramework 虽然功能强大丰富,但是使用非常简单,因为其...而且,ESFramework还提供了Rapid引擎给使用者进行快速开发,从未接触过ESFramework的人,也可以在1-2个小时之内便上手使用Rapid引擎开发分布式通信系统。

    PHP实例开发源码-ESFramework之动态组Demo php版.zip

    PHP实例开发源码—ESFramework之动态组Demo php版.zip PHP实例开发源码—ESFramework之动态组Demo php版.zip PHP实例开发源码—ESFramework之动态组Demo php版.zip

    ESFramework2.0源码和Demo

    ESFramework2.0源码、 ESFramework Demos、 ESFramework4.7通信框架

    ESFramework2.0源码

    ESFramework2.0源码、 ESFramework Demos、 ESFramework4.7通信框架 即时通信框架

    ESFramework2.0

    ESFramework2.2最新版本

    ESFramework通信组件 v4.0.zip

    ESFramework通信组件,底层使用IOCP模型,支持局域网和广域网的P2P通信,支持文件传送,支持跨平台通信,支持服务器群集,可以嵌入其它软件,二次开发,文档齐全,接口清晰规范,容易上手。

    ESFramework实例

    ESFramework实例

    ESFramework.Demo

    ESFramework.Demo

Global site tag (gtag.js) - Google Analytics