龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C#开发 >

ESFramework4.0文件传送 如此简单(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
三.客户端 同ESPlus的Basic应用或CustomizeInfo应用一样,在客户端支持文件传送功能也需要使用到相应的Outter组件和实现相应的BusinessHandler接口。 1.IFileOutter

三.客户端

同ESPlus的Basic应用或CustomizeInfo应用一样,在客户端支持文件传送功能也需要使用到相应的“Outter”组件和实现相应的“BusinessHandler”接口。

1.IFileOutter

  1. ESPlus.Application.FileTransfering.Passive.IFileOutter接口从IFileController继承,并增加了一个属性和一个方法:  
  2. public interface IFileOutter : IOutter ,IFileController  
  3. {  
  4. /// <summary>  
  5. /// 发送文件数据包时所采用的消息优先级。  
  6. /// </summary>  
  7. DataPriority DataPriority4SendingFile { getset; }  
  8. /// <summary>  
  9. /// 初始化文件传送查看器控件。  
  10. /// </summary>  
  11. /// <param name="viewer">文件传送查看器控件对象</param>  
  12. /// <param name="destUserID">目标用户的ID。返回的查看器将显示与该用户相关的所有文件传送状态。如果传入null,则显示与任何用户的文件传送的实时状态。</param>  
  13. 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接口:

  1. public interface IFileTransferingViewer  
  2. {  
  3. /// <summary>  
  4. /// 当某个文件开始续传时,触发该事件。参数为FileName - isSend  
  5. /// </summary>  
  6. event CbGeneric<stringbool> FileResumedTransStarted;  
  7. /// <summary>  
  8. /// 当某个文件传送完毕时,触发该事件。参数为FileName - isSend  
  9. /// </summary>  
  10. event CbGeneric<stringbool> FileTransCompleted;  
  11. /// <summary>  
  12. /// 当某个文件传送中断时,触发该事件。参数为FileName - isSend - FileTransDisrupttedType  
  13. /// </summary>  
  14. event CbGeneric<stringbool, FileTransDisrupttedType> FileTransDisruptted;  
  15. /// <summary>  
  16. /// 当某个文件传送开始时,触发该事件。参数为FileName - isSend  
  17. /// </summary>  
  18. event CbGeneric<stringbool> FileTransStarted;  
  19. /// <summary>  
  20. /// 当所有文件都传送完成时,触发该事件。  
  21. /// </summary>  
  22. event CbSimple AllTaskFinished;  
  23. /// <summary>  
  24. /// 当点击取消按钮终止某个文件传送时,触发该事件。  
  25. /// </summary>  
  26. event CbCancelFile CancelFileButtonClicked;   
  27. /// <summary>  
  28. /// 当前是否有文件正在传送中。  
  29. /// </summary>   
  30. bool IsFileTransfering();  
  31. }  

你也可以通过该接口来关注FileTransferingViewer查看器捕捉到的(正如前所述,不一定是全部)文件传送项目的状态,而且,该接口的事件都是在UI线程中触发的,你可以直接在其处理函数中操控UI显示。

2.IFileBusinessHandler

客户端的ESPlus.Application.FileTransfering.Passive.IFileBusinessHandler直接从IFileHandler继承,而且没有增加额外的内容:

  1. public interface IFileBusinessHandler : IBusinessHandler, IFileHandler  
  2. {   
  3. }  

四.服务端

服务端也可以接收客户端发送的文件(即上传),甚至可以发送文件给客户端(即下载),它遵循同样的文件传送流程。

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方法增加了一个重载:

  1. void Initialize(string userID, string serverIP, int serverPort, IBasicBusinessHandler basicHandler, ICustomizeInfoBusinessHandler customizeHandler ,IFileBusinessHandler fileHandler); 

该重载增加了一个IFileBusinessHandler参数,用于支持文件传送机制。

另外,IRapidPassiveEngine增加了一个IFileOutter只读属性,通过暴露的该属性,我们就可以提交发送文件的请求或监控文件传送的状态了。当然,如果在Initialize方法中没有传入有效的IFileBusinessHandler引用,则FileOutter属性将返回null。

2.服务端

同客户端一样,服务端IRapidServerEngine的Initialize方法也增加了一个重载:

  1. void Initialize(int port, ICustomizeInfoBusinessHandler customizeInfoBusinessHandler,IFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager);  

IRapidServerEngine提供了IFileTransferingController只读属性,用于提交发送文件的请求或监控文件传送的状态。同样的,如果在Initialize方法中没有传入有效的IFileBusinessHandler引用,则FileTransferingController属性将返回null。

Rapid引擎已经为我们组装好了与文件传送相关的所有组件,我们直接使用即可。如果后面有时间,我们会更深入地剖析ESPlus的文件传送机制背后的原理,以及如何一步步地搭建起文件传送的功能。

ESPlus使得在基于ESFramework的通信系统中增加文件传送的功能变得如此简单,甚至,基于ESPlus提供的文件传送功能,我们可以很快地实现文件服务器,以支持文件上传和下载。希望能给你带来帮助。


收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接