程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#網絡編程(訂立協議和發送文件) - Part.4(6)

C#網絡編程(訂立協議和發送文件) - Part.4(6)

編輯:關於C語言

接下來我們來看下這段代碼,有這麼兩點需要注意一下:

在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程序測試

接下裡我們運行一下程序,來檢查一下輸出,首先看下服務端:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved