服务器端 (接收端)
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("发送完成!"); } } }