日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 实现超大文件传输、断点续传等功能

發(fā)布時(shí)間:2024/3/26 C# 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 实现超大文件传输、断点续传等功能 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 一、說(shuō)明
    • 二、程序集源碼
        • 2.1 源碼位置
        • 2.2 說(shuō)明文檔
    • 三、安裝
    • 四、特點(diǎn)
        • 1.1 文件傳輸協(xié)議兼容性
        • 1.2 與FTP相比
        • 1.3 功能亮點(diǎn)
    • 四、創(chuàng)建服務(wù)器
    • 五、創(chuàng)建客戶端
    • 六、總結(jié)


文章目錄

    • 一、說(shuō)明
    • 二、程序集源碼
        • 2.1 源碼位置
        • 2.2 說(shuō)明文檔
    • 三、安裝
    • 四、特點(diǎn)
        • 1.1 文件傳輸協(xié)議兼容性
        • 1.2 與FTP相比
        • 1.3 功能亮點(diǎn)
    • 四、創(chuàng)建服務(wù)器
    • 五、創(chuàng)建客戶端
    • 六、總結(jié)


一、說(shuō)明

經(jīng)常有小伙伴在開發(fā)控制臺(tái)winformWPF等C/S軟件時(shí),會(huì)有文件傳輸的需求。正好RRQMSocket.RPC完美支持這個(gè),所以給大家介紹一波。


二、程序集源碼

2.1 源碼位置

  • Gitee
  • Github

2.2 說(shuō)明文檔

文檔首頁(yè)

三、安裝

Nuget安裝RRQMSocket.RPC即可,具體步驟詳看鏈接博客。

VS、Unity安裝和使用Nuget包

四、特點(diǎn)

1.1 文件傳輸協(xié)議兼容性

RRQM文件傳輸使用的是特殊傳輸協(xié)議,與FTP,HTTP等協(xié)議完全不兼容,所以如果使用文件傳輸,則服務(wù)器與客戶端必須均使用RRQM組件。

1.2 與FTP相比

因?yàn)镽RQM使用的是特殊協(xié)議,所以性能、功能上要遠(yuǎn)強(qiáng)于FTP,且搭建簡(jiǎn)單,支持多通道傳輸?shù)取?/p>

1.3 功能亮點(diǎn)

  • 簡(jiǎn)單易用。
  • 多線程處理。
  • 高性能,實(shí)測(cè)傳輸速度可達(dá)1000Mb/s
  • 超簡(jiǎn)單的傳輸限速設(shè)置,1k-10Gb 無(wú)級(jí)調(diào)節(jié)。
  • 超簡(jiǎn)單的傳輸速度、傳輸進(jìn)度獲取。
  • 隨心所欲的暫停、繼續(xù)、停止傳輸。
  • 系統(tǒng)化的權(quán)限管理,讓敏感文件只允許私有化下載
  • RPC交互,讓客戶端和服務(wù)器交流不延遲。
  • 基于事件驅(qū)動(dòng),讓每一步操作盡在掌握。
  • 超簡(jiǎn)單的斷點(diǎn)續(xù)傳設(shè)置,為大文件傳輸保駕護(hù)航。
  • 已經(jīng)上傳的文件,再次上傳時(shí),可實(shí)現(xiàn)快速上傳
  • 極少的GC釋放。

演示: 可以看到,下圖正在上傳一個(gè)Window的系統(tǒng)鏡像文件,大約4.2Gb,傳輸速度已達(dá)到800Mb/s,GC基本上沒(méi)有釋放,性能非常強(qiáng)悍(中間有稍微停頓,因?yàn)槌绦蛟讷@取文件MD5值)。


四、創(chuàng)建服務(wù)器

static void Main(string[] args) {TcpTouchRpcService service = GetService();service.Logger.Message("服務(wù)器成功啟動(dòng)");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")//連接驗(yàn)證口令。.BuildWithTcpTouchRpcService();//此處build相當(dāng)于new TcpTouchRpcService,然后Setup,然后Start。service.Handshaked += (client, e) =>{client.Logger.Message($"有客戶端成功驗(yàn)證,ID={client.ID}");};service.Disconnected += (client, e) =>{client.Logger.Message($"有客戶端斷開,ID={client.ID}");};service.FileTransfering += (client, e) =>{//有可能是上傳,也有可能是下載client.Logger.Message($"有客戶端請(qǐng)求傳輸文件,ID={client.ID},請(qǐng)求類型={e.TransferType},請(qǐng)求文件名={e.FileRequest.Path}");};service.FileTransfered += (client, e) =>{//傳輸結(jié)束,但是不一定成功,需要從e.Result判斷狀態(tài)。client.Logger.Message($"客戶端傳輸文件結(jié)束,ID={client.ID},請(qǐng)求類型={e.TransferType},文件名={e.FileRequest.Path},請(qǐng)求狀態(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($"服務(wù)器請(qǐng)求傳輸文件,ID={client.ID},請(qǐng)求類型={e.TransferType},文件名={e.FileInfo.FileName}");};client.FileTransfered += (client, e) =>{//傳輸結(jié)束,但是不一定成功,需要從e.Result判斷狀態(tài)。client.Logger.Message($"服務(wù)器傳輸文件結(jié)束,ID={client.ID},請(qǐng)求類型={e.TransferType},文件名={e.FileInfo.FileName},請(qǐng)求狀態(tài)={e.Result}");};client.Logger.Message("連接成功");//第一個(gè)參數(shù)是請(qǐng)求路徑,第二個(gè)是保存路徑。FileRequest fileRequest = new FileRequest(@"D:\System\Windows.iso", $@"Windows.iso");fileRequest.Flags = TransferFlags.BreakpointResume;//嘗試斷點(diǎn)續(xù)傳,使用斷點(diǎn)續(xù)傳時(shí),會(huì)驗(yàn)證MD5值FileOperator fileOperator = new FileOperator();//實(shí)例化本次傳輸?shù)目刂破?#xff0c;用于獲取傳輸進(jìn)度、速度、狀態(tài)等。fileOperator.Timeout = 60 * 1000;//當(dāng)傳輸大文件,且啟用斷點(diǎn)續(xù)傳時(shí),服務(wù)器可能會(huì)先計(jì)算MD5,而延時(shí)響應(yīng),所以需要設(shè)置超時(shí)時(shí)間。//此處的作用相當(dāng)于Timer,定時(shí)每秒輸出當(dāng)前的傳輸進(jìn)度和速度。LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>{if (fileOperator.Result.ResultCode != ResultCode.Default){loop.Dispose();}client.Logger.Message($"進(jìn)度:{fileOperator.Progress},速度:{fileOperator.Speed()}");});loopAction.RunAsync();Metadata metadata = new Metadata();//傳遞到服務(wù)器的元數(shù)據(jù)metadata.Add("1", "1");metadata.Add("2", "2");//此方法會(huì)阻塞,直到傳輸結(jié)束,也可以使用PullFileAsyncIResult result = client.PullFile(fileRequest, fileOperator, metadata);client.Logger.Message(result.ToString());Console.ReadKey(); }

六、總結(jié)

實(shí)際上,文件傳輸功能,在客戶端之間也可以直接傳輸,服務(wù)器也可以直接向客戶端主動(dòng)Pull、Push文件。而且,對(duì)于TouchRpc而言,文件傳輸也僅僅是的其中一個(gè)功能而已,更多的功能請(qǐng)?jiān)谡f(shuō)明文檔獲取。

總結(jié)

以上是生活随笔為你收集整理的C# 实现超大文件传输、断点续传等功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。