ESFramework4.0文件传送 如此简单(1)(2)
三.客户端
同ESPlus的Basic应用或CustomizeInfo应用一样,在客户端支持文件传送功能也需要使用到相应的“Outter”组件和实现相应的“BusinessHandler”接口。
1.IFileOutter
- ESPlus.Application.FileTransfering.Passive.IFileOutter接口从IFileController继承,并增加了一个属性和一个方法:
- public interface IFileOutter : IOutter ,IFileController
- {
- /// <summary>
- /// 发送文件数据包时所采用的消息优先级。
- /// </summary>
- DataPriority DataPriority4SendingFile { get; set; }
- /// <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接口:
- public interface IFileTransferingViewer
- {
- /// <summary>
- /// 当某个文件开始续传时,触发该事件。参数为FileName - isSend
- /// </summary>
- event CbGeneric<string, bool> FileResumedTransStarted;
- /// <summary>
- /// 当某个文件传送完毕时,触发该事件。参数为FileName - isSend
- /// </summary>
- event CbGeneric<string, bool> FileTransCompleted;
- /// <summary>
- /// 当某个文件传送中断时,触发该事件。参数为FileName - isSend - FileTransDisrupttedType
- /// </summary>
- event CbGeneric<string, bool, FileTransDisrupttedType> FileTransDisruptted;
- /// <summary>
- /// 当某个文件传送开始时,触发该事件。参数为FileName - isSend
- /// </summary>
- event CbGeneric<string, bool> FileTransStarted;
- /// <summary>
- /// 当所有文件都传送完成时,触发该事件。
- /// </summary>
- event CbSimple AllTaskFinished;
- /// <summary>
- /// 当点击取消按钮终止某个文件传送时,触发该事件。
- /// </summary>
- event CbCancelFile CancelFileButtonClicked;
- /// <summary>
- /// 当前是否有文件正在传送中。
- /// </summary>
- bool IsFileTransfering();
- }
你也可以通过该接口来关注FileTransferingViewer查看器捕捉到的(正如前所述,不一定是全部)文件传送项目的状态,而且,该接口的事件都是在UI线程中触发的,你可以直接在其处理函数中操控UI显示。
2.IFileBusinessHandler
客户端的ESPlus.Application.FileTransfering.Passive.IFileBusinessHandler直接从IFileHandler继承,而且没有增加额外的内容:
- public interface 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提供的文件传送功能,我们可以很快地实现文件服务器,以支持文件上传和下载。希望能给你带来帮助。
- 上一篇:趣味编程:C#扫雷代码
- 下一篇:C#面试中常出现的问题