程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> ESFramework4.0文件傳送 如此簡單(2)

ESFramework4.0文件傳送 如此簡單(2)

編輯:關於C語言

三.客戶端

同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 { get; set; }  
  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<string, bool> FileResumedTransStarted;  
  7. /// <summary>  
  8. /// 當某個文件傳送完畢時,觸發該事件。參數為FileName - isSend  
  9. /// </summary>  
  10. event CbGeneric<string, bool> FileTransCompleted;  
  11. /// <summary>  
  12. /// 當某個文件傳送中斷時,觸發該事件。參數為FileName - isSend - FileTransDisrupttedType  
  13. /// </summary>  
  14. event CbGeneric<string, bool, FileTransDisrupttedType> FileTransDisruptted;  
  15. /// <summary>  
  16. /// 當某個文件傳送開始時,觸發該事件。參數為FileName - isSend  
  17. /// </summary>  
  18. event CbGeneric<string, bool> 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提供的文件傳送功能,我們可以很快地實現文件服務器,以支持文件上傳和下載。希望能給你帶來幫助。

【編輯推薦】

  1. 教你寫不可思議的C#代碼
  2. C#用Activex實現Web客戶端讀取RFID功能
  3. Visual Studio 2010調用非C#編寫的DLL文件
  4. More Effective C#:改善 C#程序的 50個具體辦法

【責任編輯:QiHappy TEL:(010)68476606】
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved