程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#網絡編程(接收文件)五

C#網絡編程(接收文件)五

編輯:C#入門知識

這篇文章將完成C#網絡編程(訂立協議和發送文件)四中剩余的部分,它們本來是一篇完整的文章,但是因為上一篇比較長,合並起來頁數太多,浏覽起來可能會比較不方便,我就將它拆為兩篇了,本文便是它的後半部分。我們繼續進行上一篇沒有完成的步驟:客戶端接收來自服務端的文件。

4.客戶端接收文件

4.1服務端的實現

對於服務端,我們只需要實現上一章遺留的sendFile()方法就可以了,它起初在handleProtocol中是注釋掉的。另外,由於創建連接、獲取流等操作與receiveFile()是沒有區別的,所以我們將它提出來作為一個公共方法getStreamToClient()。下面是服務端的代碼,只包含新增改過的代碼,對於原有方法我只給出了簽名:

class Server {
    static void Main(string[] args) {
        Console.WriteLine("Server is running ... ");
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        TcpListener listener = new TcpListener(ip, 8500);

        listener.Start();           // 開啟對控制端口 8500 的偵聽
        Console.WriteLine("Start Listening ...");

        while (true) {
            // 獲取一個連接,同步方法,在此處中斷
            TcpClient client = listener.AcceptTcpClient(); 
            RemoteClient wapper = new RemoteClient(client);
            wapper.BeginRead();
        }
    }
}

public class RemoteClient {
    // 字段 略

    public RemoteClient(TcpClient client) {}

    // 開始進行讀取
    public void BeginRead() { }

    // 再讀取完成時進行回調
    private void OnReadComplete(IAsyncResult ar) { }

    // 處理protocol
    private void handleProtocol(object obj) {
        string pro = obj as string;
        ProtocolHelper helper = new ProtocolHelper(pro);
        FileProtocol protocol = helper.GetProtocol();

        if (protocol.Mode == FileRequestMode.Send) {
            // 客戶端發送文件,對服務端來說則是接收文件
            receiveFile(protocol);
        } else if (protocol.Mode == FileRequestMode.Receive) {
            // 客戶端接收文件,對服務端來說則是發送文件
            sendFile(protocol);
        }
    }

    // 發送文件
    private void sendFile(FileProtocol protocol) {
        TcpClient localClient;
        NetworkStream streamToClient = getStreamToClient(protocol, out localClient);

        // 獲得文件的路徑
        string filePath = Environment.CurrentDirectory + "/" + protocol.FileName;

        // 創建文件流
        FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        byte[] fileBuffer = new byte[1024];     // 每次傳1KB
        int bytesRead;
        int totalBytes = 0;

        // 創建獲取文件發送狀態的類
        SendStatus status = new SendStatus(filePath);

        // 將文件流轉寫入網絡流
        try {
            do {
                Thread.Sleep(10);           // 為了更好的視覺效果,暫停10毫秒:-)

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