C# 实现超大文件传输、断点续传等功能
生活随笔
收集整理的這篇文章主要介紹了
C# 实现超大文件传输、断点续传等功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 一、說明
- 二、程序集源碼
- 2.1 源碼位置
- 2.2 說明文檔
- 三、安裝
- 四、特點
- 1.1 文件傳輸協(xié)議兼容性
- 1.2 與FTP相比
- 1.3 功能亮點
- 四、創(chuàng)建服務器
- 五、創(chuàng)建客戶端
- 六、總結
文章目錄
- 一、說明
- 二、程序集源碼
- 2.1 源碼位置
- 2.2 說明文檔
- 三、安裝
- 四、特點
- 1.1 文件傳輸協(xié)議兼容性
- 1.2 與FTP相比
- 1.3 功能亮點
- 四、創(chuàng)建服務器
- 五、創(chuàng)建客戶端
- 六、總結
一、說明
經常有小伙伴在開發(fā)控制臺、winform、WPF等C/S軟件時,會有文件傳輸的需求。正好RRQMSocket.RPC完美支持這個,所以給大家介紹一波。
二、程序集源碼
2.1 源碼位置
- Gitee
- Github
2.2 說明文檔
文檔首頁
三、安裝
Nuget安裝RRQMSocket.RPC即可,具體步驟詳看鏈接博客。
VS、Unity安裝和使用Nuget包
四、特點
1.1 文件傳輸協(xié)議兼容性
RRQM文件傳輸使用的是特殊傳輸協(xié)議,與FTP,HTTP等協(xié)議完全不兼容,所以如果使用文件傳輸,則服務器與客戶端必須均使用RRQM組件。
1.2 與FTP相比
因為RRQM使用的是特殊協(xié)議,所以性能、功能上要遠強于FTP,且搭建簡單,支持多通道傳輸?shù)取?/p>
1.3 功能亮點
- 簡單易用。
- 多線程處理。
- 高性能,實測傳輸速度可達1000Mb/s。
- 超簡單的傳輸限速設置,1k-10Gb 無級調節(jié)。
- 超簡單的傳輸速度、傳輸進度獲取。
- 隨心所欲的暫停、繼續(xù)、停止傳輸。
- 系統(tǒng)化的權限管理,讓敏感文件只允許私有化下載。
- RPC交互,讓客戶端和服務器交流不延遲。
- 基于事件驅動,讓每一步操作盡在掌握。
- 超簡單的斷點續(xù)傳設置,為大文件傳輸保駕護航。
- 已經上傳的文件,再次上傳時,可實現(xiàn)快速上傳。
- 極少的GC釋放。
演示: 可以看到,下圖正在上傳一個Window的系統(tǒng)鏡像文件,大約4.2Gb,傳輸速度已達到800Mb/s,GC基本上沒有釋放,性能非常強悍(中間有稍微停頓,因為程序在獲取文件MD5值)。
四、創(chuàng)建服務器
static void Main(string[] args) {TcpTouchRpcService service = GetService();service.Logger.Message("服務器成功啟動");Console.ReadKey(); }static TcpTouchRpcService GetService() {var service = new RRQMConfig()//配置 .SetListenIPHosts(new IPHost[] { new IPHost(7789) }).SetMaxCount(10000).SetThreadCount(100).SetSingletonLogger(new LoggerGroup(new ConsoleLogger(), new FileLogger())).SetVerifyToken("File")//連接驗證口令。.BuildWithTcpTouchRpcService();//此處build相當于new TcpTouchRpcService,然后Setup,然后Start。service.Handshaked += (client, e) =>{client.Logger.Message($"有客戶端成功驗證,ID={client.ID}");};service.Disconnected += (client, e) =>{client.Logger.Message($"有客戶端斷開,ID={client.ID}");};service.FileTransfering += (client, e) =>{//有可能是上傳,也有可能是下載client.Logger.Message($"有客戶端請求傳輸文件,ID={client.ID},請求類型={e.TransferType},請求文件名={e.FileRequest.Path}");};service.FileTransfered += (client, e) =>{//傳輸結束,但是不一定成功,需要從e.Result判斷狀態(tài)。client.Logger.Message($"客戶端傳輸文件結束,ID={client.ID},請求類型={e.TransferType},文件名={e.FileRequest.Path},請求狀態(tài)={e.Result}");};return service; }五、創(chuàng)建客戶端
static void Main(string[] args) {TcpTouchRpcClient client = new RRQMConfig().SetRemoteIPHost("127.0.0.1:7789").SetVerifyToken("File").BuildWithTcpTouchRpcClient();client.FileTransfering += (client, e) =>{//有可能是上傳,也有可能是下載client.Logger.Message($"服務器請求傳輸文件,ID={client.ID},請求類型={e.TransferType},文件名={e.FileInfo.FileName}");};client.FileTransfered += (client, e) =>{//傳輸結束,但是不一定成功,需要從e.Result判斷狀態(tài)。client.Logger.Message($"服務器傳輸文件結束,ID={client.ID},請求類型={e.TransferType},文件名={e.FileInfo.FileName},請求狀態(tài)={e.Result}");};client.Logger.Message("連接成功");//第一個參數(shù)是請求路徑,第二個是保存路徑。FileRequest fileRequest = new FileRequest(@"D:\System\Windows.iso", $@"Windows.iso");fileRequest.Flags = TransferFlags.BreakpointResume;//嘗試斷點續(xù)傳,使用斷點續(xù)傳時,會驗證MD5值FileOperator fileOperator = new FileOperator();//實例化本次傳輸?shù)目刂破?#xff0c;用于獲取傳輸進度、速度、狀態(tài)等。fileOperator.Timeout = 60 * 1000;//當傳輸大文件,且啟用斷點續(xù)傳時,服務器可能會先計算MD5,而延時響應,所以需要設置超時時間。//此處的作用相當于Timer,定時每秒輸出當前的傳輸進度和速度。LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>{if (fileOperator.Result.ResultCode != ResultCode.Default){loop.Dispose();}client.Logger.Message($"進度:{fileOperator.Progress},速度:{fileOperator.Speed()}");});loopAction.RunAsync();Metadata metadata = new Metadata();//傳遞到服務器的元數(shù)據(jù)metadata.Add("1", "1");metadata.Add("2", "2");//此方法會阻塞,直到傳輸結束,也可以使用PullFileAsyncIResult result = client.PullFile(fileRequest, fileOperator, metadata);client.Logger.Message(result.ToString());Console.ReadKey(); }六、總結
實際上,文件傳輸功能,在客戶端之間也可以直接傳輸,服務器也可以直接向客戶端主動Pull、Push文件。而且,對于TouchRpc而言,文件傳輸也僅僅是的其中一個功能而已,更多的功能請在說明文檔獲取。
總結
以上是生活随笔為你收集整理的C# 实现超大文件传输、断点续传等功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3D建模你不知道的软件秘密
- 下一篇: WinForms开发桌面应用程序