用SCOKET 傳送檔案是一個不太好處理的問題,網上的例子也都是很簡單的,我準備寫一個比較完善的例子,這個就算是開始吧,以後的都會在這個例子的基礎上進行修改,準備實現多線程傳輸、斷點傳輸和檔案傳輸的完備性檢測。
在這個例子中,分別定義了檔案發送管理類(SendFileManager),檔案接收管理類(ReceiveFileManager),檔案發送類(UdpSendFile)和檔案接收類(UdpRecieveFile),以便實現盡量簡單的就可以使用它們。例子中的發送和讀寫檔案都是基於非同步,實現了對大檔案的分塊發送。例子中還提供了一個傳送檔案端和接收檔案端,都是用前面的幾個類實現了檔案的發送和接受。接受的檔案預設放在接受檔案端得根目錄下,檔案名稱以底線開始。
下面是發送和接受檔案的:
上一篇文章C# UDP(Socket)非同步傳輸檔案(1)中,實現了檔案的基本傳輸,但是傳輸過程中的資訊是看不到的,這一篇是對上一篇進行了一些改進,並且可以瞭解傳輸的資訊(加入了Log),還加入了接收或者拒絕接收檔案功能。
在上一篇中,檔案發送類(UdpSendFile)和檔案接收類(UdpRecieveFile)是直接用UdpClient來進行發送和接收的,現在,我添加了一個新的類UdpPeer,實現了基本的非同步傳輸和接收資料的方法,定義了一個介面IDataCell作為一個資料發送單元,它包含兩個方法:ToBuffer和FromBuffer,所有的發送資料都繼承它來實現。檔案發送類(UdpSendFile)和檔案接收類(UdpRecieveFile)中的UdpClient用UdpPeer代替了。
在檔案發送類(UdpSendFile)和檔案接收類(UdpRecieveFile)中加入了Log事件,以便於我們瞭解檔案的傳輸過程,在檔案接收類(UdpRecieveFile)中還加入了RequestSendFile事件,當接收到一個傳送檔案請求時可以同意或者拒絕接收檔案。下面來看看新的程式的。
接收檔案啟動偵聽:
本文接著上一篇文章C# UDP(Socket)非同步傳輸檔案(2),在上一篇文章的基礎上實現多檔案的傳輸和檔案傳輸完成後進行完整性校正。
要實現多檔案的傳輸,必須要對文(2)中傳送檔案的資料格式進行改進,必須加入每個發送資料屬於哪個檔案的標識,這樣在檔案接收的時候我們才能正確的處理這些資料。在具體的實現中,我是用檔案的MD5值作為不同檔案的資料標識的,這樣當我們收到資料時,先根據MD5值判斷資料屬於哪一個檔案,然後進行相應的處理。
要實現多檔案的傳輸,在檔案發送類(UdpSendFile)和檔案接收類(UdpRecieveFile)中,就不能只定義一個SendFileManager和ReceiveFileManager來管理髮送和接收檔案了,我們要對每一個檔案都建立一個對應的SendFileManager和ReceiveFileManager來管理。在件發送類(UdpSendFile)和檔案接收類(UdpRecieveFile)中,都用一個Dictionary<TKey, TValue>來隱藏檔對應的管理對象,TKey為檔案的MD5,TValue就是傳送檔案和接收檔案類對象了。當收到資料的時候,我們就根據資料中的MD5值找到對應的檔案管理對象,進行相應的操作。當檔案發送或者傳輸完畢後,我們就從Dictionary<TKey, TValue>中移除相應的對象並且清理它們所佔的資源。
當檔案接收完成後,我在ReceiveFileManager中新定義了一個事件ReceiveFileComplete,這個事件將對檔案進行MD5校正,並且將結果通知我們,我們就可以知道檔案是否完整的傳輸了過來。
現在我們來看看多檔案傳輸和MD5校正的和:
傳送檔案啟動偵聽:
接收檔案收到傳送檔案請求:
同意接收,開始接受檔案:
發送端收到同意接收資訊後開始傳送檔案: