接下來我們來看下這段代碼,有這麼兩點需要注意一下:
在Main()方法中可以看到,圖片的位置為應用程序所在的目錄,如果你跟我一樣處於調試模式,那麼 就在解決方案的Bin目錄下的Debug目錄中放置三張圖片Client01.jpg、Client02.jpg、ClIEnt03.jpg,用 來發往服務端。
我在客戶端提供了兩個SendFile()方法,和一個BeginSendFile()方法,分別用於同步和異步傳輸,其 中私有的SendFile()方法只是一個輔助方法。實際上對於發送文件這樣的操作我們幾乎總是需要使用異步 操作。
SendMessage()方法中給streamToServer加鎖很重要,因為SendFile()方法是多線程訪問的,而在 SendFile()方法中又調用了SendMessage()方法。
我另外編寫了一個SendStatus類,它用來記錄和打印發送完成的狀態,已經發送了多少字節,完成度 是百分之多少,等等。本來這個類的內容我是直接寫入在Client類中的,後來我覺得它執行的工作已經不 屬於ClIEnt本身所應該執行的領域之內了,我記得這樣一句話:當你覺得類中的方法與類的名稱不符的時 候,那麼就應該考慮重新創建一個類。我覺得用在這裡非常恰當。
下面是SendStatus的內容:
// 即時計算發送文件的狀態
public class SendStatus {
private FileInfo info;
private long fileBytes;
public SendStatus(string filePath) {
info = new FileInfo(filePath);
fileBytes = info.Length;
}
public void PrintStatus(int sent) {
string percent = GetPercent(sent);
Console.WriteLine("Sending {0} bytes, {1}% ...", sent, percent);
}
// 獲得文件發送的百分比
public string GetPercent(int sent){
decimal allBytes = Convert.ToDecimal(fileBytes);
decimal currentSent = Convert.ToDecimal(sent);
decimal percent = (currentSent / allBytes) * 100;
percent = Math.Round(percent, 1); //保留一位小數
if (percent.ToString() == "100.0")
return "100";
else
return percent.ToString();
}
}
3.3程序測試
接下裡我們運行一下程序,來檢查一下輸出,首先看下服務端: