C# 簡單文件傳輸 源代碼


SimpleTransferFile

服務器端 (接收端)

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("發送完成!");
        }
    }
}

 

源程序下載

執行程序下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM