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