這篇文章將完成C#網絡編程(訂立協議和發送文件)四中剩余的部分,它們本來是一篇完整的文章,但是因為上一篇比較長,合並起來頁數太多,浏覽起來可能會比較不方便,我就將它拆為兩篇了,本文便是它的後半部分。我們繼續進行上一篇沒有完成的步驟:客戶端接收來自服務端的文件。
對於服務端,我們只需要實現上一章遺留的sendFile()方法就可以了,它起初在handleProtocol中是注釋掉的。另外,由於創建連接、獲取流等操作與receiveFile()是沒有區別的,所以我們將它提出來作為一個公共方法getStreamToClient()。下面是服務端的代碼,只包含新增改過的代碼,對於原有方法我只給出了簽名:
class Server {
static void
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毫秒:-)