C# 实现超大文件传输、断点续传等功能
文章目錄
- 一、說(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)、winform、WPF等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)題。
- 上一篇: 3D建模你不知道的软件秘密
- 下一篇: Head First C#中文版 图文