C 網路程式設計 接收檔案 Part 5

2021-05-22 23:28:10 字數 1824 閱讀 1322

4.客戶端接收檔案

4.1服務端的實現

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

服務端的sendfile方法和客戶端的sendfile()方法完全類似,上面的**幾乎是一次編寫成功的。另外注意我將客戶端使用的sendstatus類也拷貝到了服務端。接下來我們看下客戶端。

4.2客戶端的實現

首先要注意的是客戶端的sendfile()接收的引數是檔案全路徑,但是在寫入到協議時只獲取了路徑中的檔名稱。這是因為服務端不需要知道檔案在客戶端的路徑,所以協議中只寫檔名;而為了使客戶端的sendfile()方法更通用,所以它接收本地檔案的全路徑。

客戶端的receivefile()的實現也和服務端的receivefile()方法類似,同樣,由於要儲存到本地,為了避免檔名重複,我將服務端的generatefilename()方法複製了過來。

public class serverclient :idisposable

// 傳送訊息到服務端

public void sendmessage(string msg) {}

// 傳送檔案 - 非同步方法

public void beginsendfile(string filepath)

private void sendfile(object obj)

// 傳送檔案 -- 同步方法

public void sendfile(string filepath) {}

// 接收檔案 -- 非同步方法

public void beginreceivefile(string filename)

public void receivefile(object obj)

// 接收檔案 -- 同步方法

public void receivefile(string filename) bytes ...", totalbytes);

} while (bytesread > 0);

console.writeline("total bytes received, done!", totalbytes);

fs.dispose();          

stream.dispose();

localclient.close();

listener.stop();

}// 隨機獲取乙個名稱

private string generatefilename(string filename) {}

public void dispose()

}

上面關鍵的一句就是建立協議那句,注意到將mode由send改為了receive,同時傳去了想要接收的服務端的檔名稱。

4.3程式測試

現在我們已經完成了所有收發檔案的步驟,可以看到服務端的所有操作都是被動的,接下來我們修改客戶端的main()程式,建立乙個選單,然後根據使用者輸入傳送或者接收檔案。

class program               

} while (input.toupper() != "q");

client.dispose();

}}程式的執行結果和上一節類似,這裡我就不再貼圖了。接下來是本系列的最後一篇,將傳送字串與傳輸檔案的功能結合起來,建立乙個可以傳送訊息並能收發檔案的聊天程式,至於語音聊天嘛...等我學習了再告訴你.

C 網路程式設計 接收檔案 Part 5

4.1服務端的實現 對於服務端,我們只需要實現上一章遺留的sendfile 方法就可以了,它起初在handleprotocol中是注釋掉的。另外,由於建立連線 獲取流等操作與receivefile 是沒有區別的,所以我們將它提出來作為乙個公共方法getstreamtoclient 下面是服務端的 只...

C 網路程式設計 接收檔案 Part 5

4.1服務端的實現 對於服務端,我們只需要實現上一章遺留的sendfile 方法就可以了,它起初在handleprotocol中是注釋掉的。另外,由於建立連線 獲取流等操作與receivefile 是沒有區別的,所以我們將它提出來作為乙個公共方法getstreamtoclient 下面是服務端的 只...

C 網路程式設計 接收檔案 Part 5

4.1服務端的實現 對於服務端,我們只需要實現上一章遺留的sendfile 方法就可以了,它起初在handleprotocol中是注釋掉的。另外,由於建立連線 獲取流等操作與receivefile 是沒有區別的,所以我們將它提出來作為乙個公共方法getstreamtoclient 下面是服務端的 只...