服務器端 (接收端)
using System; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.IO; namespace Server { public partial class Server : Form { internal string receivedPath = string.Empty; public Server() { InitializeComponent(); } private void btnPath_Click(object sender, EventArgs e) { //FolderBrowserDialog fd = new FolderBrowserDialog(); if (folderBrowserDialog.ShowDialog() == DialogResult.OK) { receivedPath = folderBrowserDialog.SelectedPath; tbPath.Text = receivedPath; } } private async void btnStart_Click(object sender, EventArgs e) { if (receivedPath.Length > 0) { // 進入監聽狀態 TcpListener listener = TcpListener.Create(Convert.ToInt32(tbServerPort.Text)); listener.Start(); lbMsg.Text = "等待連入 ..."; TcpClient client = await listener.AcceptTcpClientAsync(); NetworkStream ns = client.GetStream(); // 獲得文件信息 long fileLength; string fileName; { byte[] fileNameBytes; byte[] fileNameLengthBytes = new byte[4]; //int32 byte[] fileLengthBytes = new byte[8]; //int64 await ns.ReadAsync(fileLengthBytes, 0, 8); // int64 await ns.ReadAsync(fileNameLengthBytes, 0, 4); // int32 fileNameBytes = new byte[BitConverter.ToInt32(fileNameLengthBytes, 0)]; await ns.ReadAsync(fileNameBytes, 0, fileNameBytes.Length); fileLength = BitConverter.ToInt64(fileLengthBytes, 0); fileName = Encoding.Default.GetString(fileNameBytes); } // 獲取授權 if (MessageBox.Show(string.Format("請允許接收文件: \r\n\r\n{0} \r\n文件長度 {1} 字節", fileName, fileLength), "", MessageBoxButtons.YesNo) != DialogResult.Yes) return; // 指定保存位置 if (fileName == string.Empty || receivedPath == string.Empty) { ns.WriteByte(0); // 許可被制止 return; } ns.WriteByte(1); // 許可被允許 FileStream fileStream = File.Open(receivedPath + "/" + fileName, FileMode.Append); // 接收 lbMsg.Text = "文件接收中 ..."; progressBar1.Value = 0; int read; int totalRead = 0; byte[] buffer = new byte[32 * 1024]; // 32k 的塊 while ((read = await ns.ReadAsync(buffer, 0, buffer.Length)) > 0) { await fileStream.WriteAsync(buffer, 0, read); totalRead += read; progressBar1.Value = (int)((100d * totalRead) / fileLength); } fileStream.Dispose(); client.Close(); MessageBox.Show("文件接收完成."); } else MessageBox.Show("請指定接收到的文件的保存路徑."); } private void Server_Load(object sender, EventArgs e) { lbMsg.Text = "服務器停止."; IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ipa in ipHostInfo.AddressList) if (ipa.AddressFamily == AddressFamily.InterNetwork) { tbServerIP.Text = ipa.ToString(); break; } } } }
客戶端 (發送端)
using System; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.IO; namespace Client { public partial class Client : Form { //IPEndPoint ipEnd; NetworkStream ns; TcpClient client; public Client() { InitializeComponent(); lbMsg.Text = "空閑"; } private void btnBrowse_Click(object sender, EventArgs e) { openFileDialog.CheckFileExists = true; openFileDialog.CheckPathExists = true; if (openFileDialog.ShowDialog() == DialogResult.OK) tbFile.Text = openFileDialog.FileName; } private async void btnConnect_Click(object sender, EventArgs e) { // 轉換 lbMsg.Text = "准備 ..."; IPAddress ipAddress; if (!IPAddress.TryParse(tbServerIP.Text, out ipAddress)) { MessageBox.Show("請輸入正確的 IP 地址."); return; } // 連接 lbMsg.Text = "連接中 ..."; client = new TcpClient(); try { await client.ConnectAsync(ipAddress, Convert.ToInt32(tbServerPort.Text)); } catch { MessageBox.Show("與服務器連接失敗."); return; } lbMsg.Text = "已連接 ..."; ns = client.GetStream(); } private async void btnSend_Click(object sender, EventArgs e) { FileInfo file; FileStream fileStream; try { file = new FileInfo(tbFile.Text); fileStream = file.OpenRead(); } catch { MessageBox.Show("無法打開指定的文件"); return; } // 發送文件信息 lbMsg.Text = "發送文件信息 ..."; { byte[] fileName = Encoding.Default.GetBytes(file.Name); byte[] fileNameLength = BitConverter.GetBytes(fileName.Length); byte[] fileLength = BitConverter.GetBytes(file.Length); await ns.WriteAsync(fileLength, 0, fileLength.Length); await ns.WriteAsync(fileNameLength, 0, fileNameLength.Length); await ns.WriteAsync(fileName, 0, fileName.Length); } // 獲取允許 lbMsg.Text = "獲取允許 ..."; { byte[] permission = new byte[1]; await ns.ReadAsync(permission, 0, 1); if (permission[0] != 1) { MessageBox.Show("服務器拒絕."); return; } } // 發送 lbMsg.Text = "發送中 ..."; progressBar1.Value = 0; int read; int totalWritten = 0; byte[] buffer = new byte[32 * 1024]; // 32k chunks while ((read = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0) { await ns.WriteAsync(buffer, 0, read); totalWritten += read; progressBar1.Value = (int)((100d * totalWritten) / file.Length); } fileStream.Close(); // .Dispose(); client.Close(); MessageBox.Show("發送完成!"); } } }