ESnetframework2.0通讯框架发送的消息安全吗?

&&&&&&ESFramework开发手册系列文章已经详细介绍了如何使用ESPlus提供的ESPlus.Application.CustomizeInfo空间来发送和处理自定义信息,而且,在我们在前面介绍的demo中,也展示了如何定义信息类型、信息协议,以及如何实现ICustomizeHandler来处理接收到的信息。在一般业务简单的系统中,我们完全可以像demo一样,在一个CustomizeHandler类中处理所有的信息,将所有的业务逻辑集中在这一个地方。但是,当业务逐渐变得复杂时,你会发现,CustomizeHandler类会变得越来越大,而且有很多关联不大的业务逻辑也纠缠在了一起。根据&低耦合、高内聚&的设计原则,我们需要对这个变得复杂的CustomizeHandler进行拆分,将一个CustomizeHandler拆分为多个高内聚低耦合的类,对收到的信息进行分类,分而治之。
一.分而治之的设计阶段
&&&&& 就像刚才提到的,分而治之的所依据的最根本原则是面向对象的基本设计理念 -- 高内聚、低耦合。
&&&&& 在实际的项目中,高内聚、低耦合所针对的分析目标就是我们的业务逻辑, 所以,对CustomizeHandler进行拆分,实际上是对业务逻辑进行拆分。再进一步,那些将被处理的自定义信息,实际上是业务逻辑类型的一个侧面的展示,所以,归根到底,在编码时,最后就是对自定义信息的类型进行拆分。
&&&&& 假设某个项目的主要业务逻辑可以拆分为A、B、C三类,那么,自定义信息也可以分为A、B、C三类,我们的经验是这样的,将不同类别的信息类型的值(整数)划归到不同的整数段。比如,A类型的自定义信息的类型值为0-100,B类型为101-200,C类型为201-300,当我们要在某类业务逻辑中增加一个信息类型时,就要在对应的数值范围内增加一个数值。这样处理之后,当我们接收到一个自定义信息,根据其类型就可以判断出它是属于哪类业务的了。
&&&&& 在做系统设计时,我们的设计师通常会将所有的信息类型整理成一个&协议类型&文档并将其定义放到一个dll中,服务端和客户端开发人员都使用这个dll的定义,并遵循文档中的信息类型的规范描述。比如,针对上面的示例可以设计类似如下的&协议类型&文档:&
&二.分而治之的实现阶段
&&&&& 在将自定义信息分类并完成了信息的格式约定后,就可以实现信息处理器了。针对A、B、C三类业务,理所当然地,我们会实现三个信息处理器分别与之对应,假设命名为ACustomizeHandler、BCustomizeHandler、CCustomizeHandler。现在的问题是,实现了这几个处理器之后,如何将它们挂接到ESFramework/ESPlus框架上了?幸运的是,ESFramework/ESPlus为分而治之这种策略提供了完美的支持,我们不需要再手动去映射信息类型与对应的处理器。
&&&&& ESPlus.Application.CustomizeInfo命名空间在服务端(Server)和客户端(Passive)都提供了IIntegratedCustomizeHandler接口 -- 可被集成的处理器接口,其定义如下所示:&
///&summary&
/// 能够被ComplexCustomizeHandler集成的ICustomizeHandler。
///&/summary&
public interface IIntegratedCustomizeHandler :ICustomizeHandler
///&summary&
/// 当前的处理器能否处理目标类型的自定义信息。
///&/summary&
///&param name="informationType"&自定义信息的类型&/param&
///&returns&能处理?&/returns&
bool CanHandle(int informationType);
&&&&& IIntegratedCustomizeHandler从ICustomizeHandler继承,说明它可以做与ICustomizeHandler完全一样的事情,只不过,它处理的是整个业务逻辑的一个子集。其增加的CanHandle方法用于说明当前处理器能处理哪些自定义信息。ACustomizeHandler、BCustomizeHandler、CCustomizeHandler 只要实现IIntegratedCustomizeHandler接口就可以了。处理器实现新加的CanHandle方法很简单,比如BCustomizeHandler实现CanHandle的代码如下所示:
public bool CanHandle(int informationType)
return informationType &= 101 && informationType &= 200;
&&&&& 在实现完了各个业务处理器之后,接下来就需要将它们合成起来,并挂接到ESFramework/ESPlus框架上。
三.分而治之的合成阶段
&&&&& 先分后合,分而治之的最后阶段是&合&,只有将ACustomizeHandler、BCustomizeHandler、CCustomizeHandler统合起来,才能形成一个完整的业务处理器以处理接收到的所有自定义信息。
&&&&&&ESPlus.Application.CustomizeInfo命名空间在服务端(Server)和客户端(Passive)都提供了ComplexCustomizeHandler类,它是一个综合处理器,相当于一个包装,可以把ACustomizeHandler、BCustomizeHandler、CCustomizeHandler综合在一起,并且ComplexCustomizeHandler又实现了IIntegratedCustomizeHandler接口,这表明了两点:
ComplexCustomizeHandler实现了IIntegratedCustomizeHandler接口,而IIntegratedCustomizeHandler又是继承自ICustomizeHandler接口,所以可以将其直接挂接到ESFramework/ESPlus框架。
ComplexCustomizeHandler实现了IIntegratedCustomizeHandler接口,表明其可以再度被其它的ComplexCustomizeHandler集成。就像在一个巨型的系统中,业务逻辑可以被逐级向下拆分,最后可以通过ComplexCustomizeHandler逐级向上合成。
&&&&& ComplexCustomizeHandler的实现原理很简单,它只是将接收到的自定义信息分派给正确的处理器去处理,而自己并不参与任何实际的业务过程。其类图如下所示:
&&&&& 针对上面的示例,我们将ACustomizeHandler、BCustomizeHandler、CCustomizeHandler的实例放到ComplexCustomizeHandler的HandlerList中,并且将ComplexCustomizeHandler对象注入到RapidPassiveEngine和RapidServerEngine的Initialize方法中,即可挂接到ESFramework/ESPlus框架。
四.更多说明
&&&&& 虽然,ESFramework/ESPlus为分而治之这种策略提供了很好的支持,但这并不是实现分而治之策略的唯一的模式。您完全可以抛开IIntegratedCustomizeHandler和ComplexCustomizeHandler,按照自己的习惯和方式,来拆分业务逻辑并进行合成,最后也会殊途同归--只要我们遵循了&低耦合、高内聚&这一最根本的设计原则。
&&&&& 阅读 更多ESFramework开发手册系列文章。
-----------------------------------------------------------------------------------------------------------------------------------------------&&&
下载免费版本的ESFramework 以及 demo源码&&&
关于ESFramework的任何问题,欢迎联系我们:&&
电话:027-&
ESFramework_IT168文库 ESFramework-使用技巧---信息处理,分而治之
标签: ESFramework 开发
分类:开发- 贡献者:gseros| 下载: 0次 文件:268.77KB 评分:...ESFramework4.x - 随笔分类 - zhuweisky - 博客园ESFramework 使用技巧 -- 信息处理,分而治之 摘要: 分而治之的所依据的最根本原则是面向对象的基本设计理念 -- 高内聚、低耦合。当CustomizeHandler类变得复杂...ESFramework 使用技巧 -- 信息处理,分而治之 - 01云ESFramework 使用技巧 -- 信息处理,分而治之 ESFramework开发手册系列文章已经详细介绍了如何使用ESPlus提供的ESPlus.Application.CustomizeInfo空间来发送和处理自定义...ESFramework 施用技巧 -- 信息处理,分而治之_IT知识问答_希赛ESFramework 使用技巧 -- 信息处理,分而治之 ESFramework开发手册系列文章已经详细介绍了如何使用ESPlus提供的ESPlus.Application.CustomizeInfo空间来发送和处理自定义...ESFramework 施用技巧 -- 信息处理,分而治之_imooo软件程序bug...ESFramework 使用技巧 -- 信息处理,分而治之ESFramework开发手册系列文章已经详细介绍了如何使用ESPlus提供的ESPlus.Application.CustomizeInfo空间来发送和处理自定义信...ESFramework-使用技巧---P2P服务器_百度文库 ESFramework-使用技巧---P2P服务器_IT/计算机_专业资料。ESFramework 使用技巧 -- P2P服务器ESFramework 使用技巧 -- P2P服务器分类: 默认分类日期: ...【DOC】ESFramework使用技巧(1)-- ESFramework 日志记录器的自动装配DOC/Microsoft Word&-&HTML版SFramework使用技巧(1)-- ESFramework 日志记录器的自动装配 Posted on 2006-...所以,我们必须手动的解决这个问题。
这个问题的解决方案需要注意三点...ESFramework络通信框架 --序 - zhuweisky - 博客园4.ESFramework介绍之(12)―― 基于Tcp连接池的消息处理器 5....3.ESFramewor使用技巧(3)-- 在插件中使用Spring ESFramework 相关:1...ESFramework 施用技巧 -- 信息处理,分而治之 -
FrameworkESFramework 使用技巧 -- 信息处理,分而治之 ESFramework开发手册 系列文章已经详细介绍了如何使用ESPlus提供的ESPlus.Application.CustomizeInfo空间来发送和处理自定义...【DOC】2007届高三第二三轮物理复习策略DOC/Microsoft Word&-&HTML版三、解答物理选择题的方法和技巧: 1.对于涉及物理概念类的选择题,应从基本概念...(四)信息给予题的求解方法 第一步是信息处理,找出有用信息,并使之跟物理知识...ESFramework 使用技巧 -- 使用紧凑的序列化器,数倍提升性能ESFramework 使用技巧 -- 使用紧凑的序列化器,数倍提升性能 在分布式通信系统中,...pactPropertySerializer解决了前面提出的几个问题,当然,它也不是全能的,使用...ESFramework 使用技巧 -- 实现离线消息 - 傲瑞中国 - 博客园ESFramework 使用技巧 -- 实现离线消息 在ESFramework 开发手册(01) -- 发送和处理信息一文中,我们介绍了如何使用ESPlus.Application.CustomizeInfo命名空间的组件来...OMCS 使用技巧 -- 实现自拍头像 - 傲瑞科技 - 官方博客您现在的位置: &
ESFramework4.0文件传送 如此简单(1)
ESFramework4.0文件传送 如此简单(1)
  ESFramework,是一套可高度复用的、灵活的、单纯而又强大的.NET通信框架,全部采用C#编写。ESFramework内置了对Tcp和Udp的支持,并且支持文本协议和流协议,提供了多种网络引擎供服务端和客户端开发人员轻松使用。采用ESFramework框架,使得您不需要了解Socket、不用再关心底层与通信相关的一切琐碎的事情,就可以在一个更高的层次上更快地开发属于您的高效稳定的网络通信应用。像IM系统、视频会议系统、数据采集系统等,凡是需要分布式通信的系统都可以使用ESFramework框架。
  一.ESPlus的文件传送流程
  ESPlus定义了文件传送的标准流程,可以用下图表示:
  (1)由发送方发起传送文件的请求。
  (2)接收方回复同意或者拒绝接收文件。如果拒收,则流程结束;否则进入下一步。
  (3)发送方发送文件数据,接收方接收文件数据。
  (4)如果文件传送过程中,接收方或发送方掉线或者取消文件传送,则文件传送被中断,流程结束。如果文件传送过程一直正常,则到最后完成文件的传送。
  有几点需要说明一下:
  (1)发送方可以是客户端,也可以是服务器;接收方也是如此。但无论发送方和接收方的类别如何,它们都遵守这一文件传送流程;就像ESFramework所有的通信引擎都公用同一套消息处理骨架流程一样。
  (2)当接收方同意接收后,框架会自动搜索是否存在匹配的续传项目,若存在,则会启动断点续传。当然,我们可以通过文件接收管理器的属性来控制断点续传功能是否开启。关于断点续传的更多内容,可以参考ESFramework 4.0 文件断点续传原理与实现。
  (3)进行文件传送的线程是由框架自动控制的,只要发送方收到了接收方同意接收的回复,框架就会自动在后台线程中发送文件数据包;同样,此时接收方也会自动处理接收到的文件数据包。
  (4)发送方或接收方都可随时取消正在传送的文件。
  (5)当文件传送被中断或完成时,发送方和接收方都会有相应的事件通知。
  二.ESPlus用于支持文件传送的基础设施
  1.TransmittingFileInfo
  无论是发送方还是接收方,针对每个文件传送任务,都需要有个对象来表示它,TransmittingFileInfo便是一个文件传送项目的封装,里面包含了类似发送者ID、接收者ID、文件名称等相关信息。
  TransmittingFileInfo的大部分属性对于发送方和接收方都是有效的,而有几个属性只对发送方有效(比如SendingFileParas),有几个属性只对接收方有效(如LocalSaveFilePath),这些在帮助文档中都有详细的说明。而且,有些属性(如OriginFileLastUpdateTime)的存在是用于支持断点续传功能的。
  2.FileTransDisrupttedType
  ESPlus使用FileTransDisrupttedType枚举定义了所有可能导致文件传送中断的原因:
  publicenum&FileTransDisrupttedType &  { &  ///&&summary&   ///&自己主动取消   ///&&/summary&   ActiveCancel, &  ///&&summary&   ///&对方取消   ///&&/summary&   DestCancel, &  ///&&summary&   ///&对方掉线   ///&&/summary&   DestOffline, &  ///&&summary&   ///&网络中断、自己掉线   ///&&/summary&   SelfOffline, &  ///&&summary&   ///&对方拒绝接收文件   ///&&/summary&   DestReject, &  ///&&summary&   ///&其它原因,如文件读取失败等   ///&&/summary&   OtherCause &  }&&
  3.IFileTransferingEvents 接口
  ESPlus定义了IFileTransferingEvents接口,用于暴露所有与文件传送相关的状态和事件:
  publicinterface&IFileTransferingEvents &  { &  ///&&summary&   ///&当某个文件开始传送时,触发该事件。   ///&&/summary&   event&CbGeneric&TransmittingFileInfo&&FileTransS &  ///&&summary&   ///&当某个文件续传开始时,触发该事件。(将不再触发FileTransStarted事件)   ///&&/summary&   event&CbGeneric&TransmittingFileInfo&&FileResumedTransS &  ///&&summary&   ///&文件传送的进度。参数为fileID(文件编号)&,total(文件大小)&,transfered(已传送字节数)   ///&&/summary&   event&CbFileSendedProgress&FileTransP& &  ///&&summary&   ///&文件传送中断时,触发该事件。   ///&&/summary&   event&CbGeneric&TransmittingFileInfo,&FileTransDisrupttedType&&FileTransD &  ///&&summary&   ///&文件传送完成时,触发该事件。   ///&&/summary&   event&CbGeneric&TransmittingFileInfo&&FileTransC& &  }&
  通过预定这些事件,我们可以知道每个传送的文件什么时候开始(或断点续传)、什么时候完成、传递的实时进度、传送中断的原因等等。要注意的是,这些事件都是在后台线程中触发的,如果在事件处理函数中需要更新UI,则需要将调用转发到UI线程。
  4.SendingFileParas
  该对象仅仅包含两个属性:SendingSpanInMSecs和FilePackageSize。发送方可以通过SendingFileParas对象来指定发送文件数据包时的频率与每个数据包的大小。一般来说,为了达到最快的传送速度,SendingSpanInMSecs可以设为0。而FilePackageSize的大小则要根据发送方与接收方的网络环境的好坏进行决定,在Internet上,一般可以设为左右;而在局网内,可以设为204800甚至更大(在局网的传送速度可以达到30M/s以上)。
  5.IFileController
  通过ESPlus.Application.FileTransfering.IFileController接口,我们可以提交发送文件的请求,并且可以主动取消正在接收或发送的文件。IFileController即可用于客户端也可用户服务端。
  publicinterface&IFileController &  { &  ///&&summary&   ///&该事件接口暴露了所有正在发送文件的实时状态。   ///&&/summary&   IFileTransferingEvents&FileSendingEvents&{&&} &  ///&&summary&   ///&该事件接口暴露了所有正在接收的文件的实时状态。   ///&&/summary&   IFileTransferingEvents&FileReceivingEvents&{&&} &  ///&&summary&   ///&准备发送文件。如果对方同意接收,则后台会自动发送文件;如果对方拒绝接收,则会取消发送。   ///&如果要发送的文件不存在或被占用,则将抛出对应的异常。   ///&&/summary&&   ///&&param&name=&accepterID&&接收文件的用户ID&/param&   ///&&param&name=&filePath&&被发送文件的路径&/param&   ///&&param&name=&comment&&其它附加备注。如果是在类似FTP的服务中,该参数可以是保存文件的路径&/param&&   ///&&param&name=&fileID&&返回即将发送文件的唯一编号&/param&   void&BeginSendFile(string&accepterID,&string&filePath,&string&comment,&outstring&fileID); &  ///&&summary&   ///&准备发送文件。如果对方同意接收,则后台会自动发送文件;如果对方拒绝接收,则会取消发送。   ///&如果要发送的文件不存在或被占用,则将抛出对应的异常。   ///&&/summary&   ///&&param&name=&accepterID&&接收文件的用户ID&/param&   ///&&param&name=&filePath&&被发送文件的路径&/param&   ///&&param&name=&comment&&其它附加备注。如果是在类似FTP的服务中,该参数可以是保存文件的路径&/param&   ///&&param&name=&paras&&发送参数设定。传入null,表示采用IFileSenderManager的默认设置。&/param&   ///&&param&name=&fileID&&返回即将发送文件的唯一编号&/param&   void&BeginSendFile(string&accepterID,&string&filePath,&string&comment,SendingFileParas&paras,&outstring&fileID); &  ///&&summary&   ///&主动取消正在发送或接收的文件,并通知对方。   ///&&/summary&&   void&CancelFileTransfering(string&fileID);& &  ///&&summary&   ///&取消与某个用户相关的正在传送项目。   ///&&/summary&&   ///&&param&name=&destUserID&&目标用户ID。&/param&   void&CancelFileTransferingAbout(string&destUserID);& &  ///&&summary&   ///&获取正在发送或接收中的文件的相关信息。   ///&&/summary&&   TransmittingFileInfo&GetFileInfo(string&fileID); &  }&
  (1)BeginSendFile用于向接收方提交发送文件的请求,如果对方同意,则后台会自动开始传递文件。该方法有个out参数fileID,用于传出标记该文件传送项目的唯一编号,比如,你打算将同一个文件发送给两个好友,将会调用两次BeginSendFile方法,而两次得到的fileID是不一样的。也就是说,fileID是用于标记文件传送项目的,而不是标记文件的。
  该方法有两个重载,区别在于第二个BeginSendFile方法多了一个SendingFileParas参数,用于主动控制文件数据包的大小和发送频率。
  在客户端使用时,BeginSendFile方法不仅可以向其他在线用户提交发送文件的请求,也可以直接向服务器提交发送文件的请求 -- 即此时文件的接收者为服务端。我们只需要将accepterID参数传入NetServer.SystemUserID,以指明由服务端而不是其他用户来接收即将发送的文件。
  (2)GetFileInfo方法可以获取任何一个正在发送或正在接收的项目信息。
  (3)CancelFileTransfering方法用于取消正在发送或接收的某个文件传送项目,调用该方法时,框架会自动通知文件传送的另一端用户,并触发FileReceivingEvents或FileSendingEvents中的FileTransDisruptted事件,而另一端也会自动触发FileTransDisruptted事件。
  (4)CancelFileTransferingAbout方法用于取消与某个指定用户相关的正在传送项目。比如,我们正在与aa01用户聊天,并且与aa01有多个文件正在传送,此时,如果要关闭与aa01的聊天窗口,那么关闭之前,通常会先调用CancelFileTransferingAbout方法来取消与aa01相关的所有文件传送。所以你经常会看到类似的提示:&您与aa01有文件正在传送中,关闭当前窗口将导致正在传送的文件中断,您确定要关闭吗?&。如果用户确认关闭,此时就正是我们要调用CancelFileTransferingAbout方法的时候了。
  (5)FileSendingEvents属性用于暴露自己作为发送者的所有正在进行的文件传送项目的实时状态;FileReceivingEvents属性用于暴露自己作为接收者的所有正在进行的文件传送项目的实时状态。
  6.IFileHandler
  IFileHandler接口将被框架回调以实现文件传送机制。同IFileController一样,其既可用于客户端也可用户服务端。
  我们需要实现ESPlus.Application.FileTransfering.IFileHandler接口来获取与文件传送请求相关通知:
  publicinterface&IFileBusinessHandler&:&IBusinessHandler &  {& &  ///&&summary&   ///&是否同意接收文件?   ///&&/summary&&   ///&&param&name=&senderID&&发送者的ID。如果为NetServer.SystemUserID,则表示是服务端发送的。&/param&   ///&&param&name=&fileName&&文件名称。&/param&   ///&&param&name=&fileLength&&文件大小。&/param&   ///&&param&name=&comment&&其它附加备注。如果是在类似FTP的服务中,该参数可以是保存文件的路径&/param&   ///&&param&name=&fileID&&文件ID。&/param&   ///&&param&name=&resumedFileItem&&如果能续传,则不为null。&/param&   ///&&returns&返回值为保存文件的路径,如果为null,表示拒绝接收/拒绝续传文件。如果参数resumedFileItem不为null,而且返回路径等于resumedFileItem.LocalFileSavePath,则表示续传;否则表示另存。&/returns&   string&ReadyToAcceptFile(string&senderID,&string&fileName,&long&fileLength,&string&comment,&string&fileID,&ResumedFileItem&resumedFileItem);& &  ///&&summary&   ///&接收者对自己发送文件请求的回复&--&同意/拒绝接收。   ///&&/summary&   ///&&param&name=&info&&文件传送项目的相关信息&/param&   ///&&param&name=&agreed&&对方是否同意&/param&   void&OnResponseOfReceiver(TransmittingFileInfo&info&,bool&agreed); &  }&
  (1)ReadyToAcceptFile方法是当前用户作为接收方时被框架回调的;而OnResponseOfReceiver方法是当前用户作为发送方时,被框架回调的。
  (2)IFileHandler接口的两个方法都将在后台线程中被框架调用,如果实现该方法时需要刷新应用程序的UI,则注意一定要转发到UI线程。
  (3)当发送方提交了发送文件的请求后,框架会在接收方回调ReadyToAcceptFileAsyn方法以询问是否同意接收,如果同意,ReadyToAcceptFileAsyn应返回有效的存储接收文件的路径,否则,返回null。
  (4)当接收方同意或拒绝接收文件,框架会在发送方回调OnResponseOfReceiver方法以通知发送者。通常,应用程序在实现OnResponseOfReceiver方法时,最多只需要告知文件发送者,而不需要再做任何其它的额外处理。因为框架已经帮你打理好了一切。
  当接收方同意接收文件后,与该文件传送项目相关的事件会通过IFileOutter暴露的IFileTransferingEvents接口相继触发。
  三.客户端
  同ESPlus的Basic应用或CustomizeInfo应用一样,在客户端支持文件传送功能也需要使用到相应的&Outter&组件和实现相应的&BusinessHandler&接口。
  1.IFileOutter
  ESPlus.Application.FileTransfering.Passive.IFileOutter接口从IFileController继承,并增加了一个属性和一个方法: &  publicinterface&IFileOutter&:&IOutter&,IFileController &  { &  ///&&summary&   ///&发送文件数据包时所采用的消息优先级。   ///&&/summary&   DataPriority&DataPriority4SendingFile&{&&&} &  ///&&summary&   ///&初始化文件传送查看器控件。   ///&&/summary&   ///&&param&name=&viewer&&文件传送查看器控件对象&/param&   ///&&param&name=&destUserID&&目标用户的ID。返回的查看器将显示与该用户相关的所有文件传送状态。如果传入null,则显示与任何用户的文件传送的实时状态。&/param&   void&InitializeFileTransferingViewer(FileTransferingViewer&viewer,&string&destUserID); &  }&
  (1)我们可以通过设置DataPriority4SendingFile属性以控制发送文件数据包的优先级,在一般系统中,可以将其设置为Common或Low,但绝不能设置为CanBeDiscarded,否则将可能导致接收方接收到的文件不完整。
  (2)ESPlus提供了默认的传送项目的状态查看器控件FileTransferingViewer,如果没有特殊需求,大家在项目中可以直接使用它来显示文件传送的实时状态,它的界面截图如下所示:
  你只需要把这个控件拖拽到你的UI上,然后将其传入IFileOutter的InitializeFileTransferingViewer方法进行初始化后,它就会正常工作了。
  InitializeFileTransferingViewer方法的第二个参数destUserID表示当前的FileTransferingViewer控件要显示与哪个好友相关的所有文件传送项目的状态。以QQ作类比,你同时在与多个好友传送文件,那么就会有多个聊天窗口,每个聊天窗口都会有一个FileTransferingViewer实例,而这个FileTransferingViewer实例仅仅显示与当前聊天窗口对应的好友的传送项目。这样依赖,你与aa01用户传送文件的进度查看器就不会在你与aa02的聊天窗口上显示出来。
  如果你的FileTransferingViewer查看器需要捕捉所有正在传送的项目的实时状态,那么,调用InitializeFileTransferingViewer方法时,destUserID参数可以传入null。
  另外,FileTransferingViewer实现了IFileTransferingViewer接口:
  publicinterface&IFileTransferingViewer &  { &  ///&&summary&   ///&当某个文件开始续传时,触发该事件。参数为FileName&-&isSend   ///&&/summary&   event&CbGeneric&string,&bool&&FileResumedTransS &  ///&&summary&   ///&当某个文件传送完毕时,触发该事件。参数为FileName&-&isSend   ///&&/summary&   event&CbGeneric&string,&bool&&FileTransC &  ///&&summary&   ///&当某个文件传送中断时,触发该事件。参数为FileName&-&isSend&-&FileTransDisrupttedType   ///&&/summary&   event&CbGeneric&string,&bool,&FileTransDisrupttedType&&FileTransD &  ///&&summary&   ///&当某个文件传送开始时,触发该事件。参数为FileName&-&isSend   ///&&/summary&   event&CbGeneric&string,&bool&&FileTransS &  ///&&summary&   ///&当所有文件都传送完成时,触发该事件。   ///&&/summary&   event&CbSimple&AllTaskF &  ///&&summary&   ///&当点击取消按钮终止某个文件传送时,触发该事件。   ///&&/summary&   event&CbCancelFile&CancelFileButtonC& &  ///&&summary&   ///&当前是否有文件正在传送中。   ///&&/summary&&   bool&IsFileTransfering(); &  }&&
  你也可以通过该接口来关注FileTransferingViewer查看器捕捉到的(正如前所述,不一定是全部)文件传送项目的状态,而且,该接口的事件都是在UI线程中触发的,你可以直接在其处理函数中操控UI显示。
  2.IFileBusinessHandler
  客户端的ESPlus.Application.FileTransfering.Passive.IFileBusinessHandler直接从IFileHandler继承,而且没有增加额外的内容:
  publicinterface&IFileBusinessHandler&:&IBusinessHandler,&IFileHandler &  {& &  }&&
  四.服务端
  服务端也可以接收客户端发送的文件(即上传),甚至可以发送文件给客户端(即下载),它遵循同样的文件传送流程。
  1.IFileTransferingController
  如果需要服务端也参与到文件的发送与接收中来,则同客户端一样,服务端的ESPlus.Application.FileTransfering.Server.IFileTransferingController接口也从IFileController继承,以提交文件发送请求、或取消正在发送中的文件等,这里就不重复解释了。
  2.IFileBusinessHandler
  服务端需要实现ESPlus.Application.FileTransfering.Server.IFileBusinessHandler接口,也是直接从IFileHandler继承,而且没有增加额外的内容。
  五.Rapid引擎对文件传送的支持
  新版本的Rapid引擎(可以从ESFramework 4.0 概述文末下载 ),增加了对文件传送的支持,使用Rapid引擎的朋友可以很方便的利用框架提供的文件传送功能。
  1.客户端
  IRapidPassiveEngine的Initialize方法增加了一个重载:
  void&Initialize(string&userID,&string&serverIP,&int&serverPort,&IBasicBusinessHandler&basicHandler,&ICustomizeInfoBusinessHandler&customizeHandler&,IFileBusinessHandler&fileHandler);&
  该重载增加了一个IFileBusinessHandler参数,用于支持文件传送机制。
  另外,IRapidPassiveEngine增加了一个IFileOutter只读属性,通过暴露的该属性,我们就可以提交发送文件的请求或监控文件传送的状态了。当然,如果在Initialize方法中没有传入有效的IFileBusinessHandler引用,则FileOutter属性将返回null。
  2.服务端
  同客户端一样,服务端IRapidServerEngine的Initialize方法也增加了一个重载:
  void&Initialize(int&port,&ICustomizeInfoBusinessHandler&customizeInfoBusinessHandler,IFileBusinessHandler&fileBusinessHandler,&IFriendsManager&friendsManager,&IGroupManager&groupManager);&&
  IRapidServerEngine提供了IFileTransferingController只读属性,用于提交发送文件的请求或监控文件传送的状态。同样的,如果在Initialize方法中没有传入有效的IFileBusinessHandler引用,则FileTransferingController属性将返回null。
  Rapid引擎已经为我们组装好了与文件传送相关的所有组件,我们直接使用即可。如果后面有时间,我们会更深入地剖析ESPlus的文件传送机制背后的原理,以及如何一步步地搭建起文件传送的功能。
  ESPlus使得在基于ESFramework的通信系统中增加文件传送的功能变得如此简单,甚至,基于ESPlus提供的文件传送功能,我们可以很快地实现文件服务器,以支持文件上传和下载。希望能给你带来帮助。
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&增值电信业务经营许可证湘B2-}

我要回帖

更多关于 netframework2.0 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信