三.客戶端
同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提供的文件傳送功能,我們可以很快地實現文件服務器,以支持文件上傳和下載。希望能給你帶來幫助。
【編輯推薦】