Вы этой статье я покажу как можно создать клиентско серверное приложение для передачи файлов по сети.
Для начала напишем проект для передачи файла:
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.Serialization.Formatters.Binary; using System.IO; using System.Net; using System.Net.Sockets; namespace File_Sender { /// <summary> /// Summary description for Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.TextBox text_IP; private System.Windows.Forms.OpenFileDialog openFileDialog1; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.text_IP = new System.Windows.Forms.TextBox(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.SuspendLayout(); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(48, 56); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(240, 20); this.textBox1.TabIndex = 0; this.textBox1.Text = ""; this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); // // button1 // this.button1.Location = new System.Drawing.Point(296, 56); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(48, 23); this.button1.TabIndex = 1; this.button1.Text = "::"; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Enabled = false; this.button2.Location = new System.Drawing.Point(16, 152); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(128, 23); this.button2.TabIndex = 2; this.button2.Text = "Send The File To:"; this.button2.Click += new System.EventHandler(this.button2_Click); // // text_IP // this.text_IP.Location = new System.Drawing.Point(152, 152); this.text_IP.Name = "text_IP"; this.text_IP.Size = new System.Drawing.Size(208, 20); this.text_IP.TabIndex = 3; this.text_IP.Text = "127.0.0.1"; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(400, 266); this.Controls.Add(this.text_IP); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.textBox1); this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "File Sender - By Fadi Abdel-qader fadidotnet.org"; this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } private void button2_Click(object sender, System.EventArgs e) { FileStream fs = new FileStream(textBox1.Text,FileMode.Open); byte[] buffer = new byte[fs.Length]; int len = (int)fs.Length; fs.Read(buffer,0,len); fs.Close(); BinaryFormatter br = new BinaryFormatter (); TcpClient myclient = new TcpClient (text_IP.Text,7000); NetworkStream myns = myclient.GetStream (); br.Serialize (myns,FileName); BinaryWriter mysw = new BinaryWriter (myns); mysw.Write(buffer); mysw.Close (); myns.Close (); myclient.Close (); } string FileName; private void button1_Click(object sender, System.EventArgs e) { openFileDialog1.ShowDialog(); textBox1.Text = openFileDialog1.FileName; FileInfo TheFile = new FileInfo(textBox1.Text); // Get The File Name FileName = TheFile.Name; } private void textBox1_TextChanged(object sender, System.EventArgs e) { if (textBox1.Text.Length > 3) button2.Enabled = true; else button2.Enabled = false; } } }
Теперь создадим проект для приема данный:
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters; using System.IO; using System.Net; using System.Net.Sockets; namespace File_Receiver { /// <summary> /// Summary description for Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.ListBox listBox1; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.listBox1 = new System.Windows.Forms.ListBox(); this.SuspendLayout(); // // label1 // this.label1.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(224)), ((System.Byte)(224)), ((System.Byte)(224))); this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(178))); this.label1.Location = new System.Drawing.Point(8, 8); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(160, 23); this.label1.TabIndex = 0; this.label1.Text = "Automatically Save to"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(176, 8); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(176, 20); this.textBox1.TabIndex = 1; this.textBox1.Text = "C:\\"; // // listBox1 // this.listBox1.Dock = System.Windows.Forms.DockStyle.Bottom; this.listBox1.Location = new System.Drawing.Point(0, 48); this.listBox1.Name = "listBox1"; this.listBox1.Size = new System.Drawing.Size(408, 134); this.listBox1.TabIndex = 2; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(408, 182); this.Controls.Add(this.listBox1); this.Controls.Add(this.textBox1); this.Controls.Add(this.label1); this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "File Receiver By Fadi Abdel-qader fadidotnet.org"; this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing); this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } NetworkStream myns; TcpListener mytcpl; Socket mysocket; Thread myth; BinaryReader bb; void File_Receiver() { mytcpl = new TcpListener (7000); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); BinaryFormatter br = new BinaryFormatter (); object op; op= br.Deserialize (myns); // Deserialize the Object from Stream bb = new BinaryReader (myns); byte[] buffer = bb.ReadBytes(5000000); FileStream fss = new FileStream(@textBox1.Text + (string) op, FileMode.CreateNew, FileAccess.Write); fss.Write(buffer,0,buffer.Length); fss.Close(); mytcpl.Stop(); listBox1.Items.Add ("Successfully Saved to: " + textBox1.Text + (string) op); if (mysocket.Connected ==true) { while (true) { File_Receiver(); } } } private void Form1_Load(object sender, System.EventArgs e) { myth= new Thread (new System.Threading .ThreadStart(File_Receiver)); // Start Thread Session myth.Start (); } private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { myth.Abort (); mytcpl.Stop (); } } }

N
Как это работает:
- Сервер запускается и начинает слушать порт
5000
. - Клиент подключается к серверу и отправляет файл
send_file.txt
. - Сервер сохраняет файл как
received_file.txt
.
Советы по улучшению:
- Добавьте протокол: имя файла, размер, подтверждения.
- Используйте
async/await
для асинхронной передачи. - Добавьте многопоточность для обработки нескольких клиентов.
- Реализуйте авторизацию и шифрование при передаче.
Вывод
Это базовый пример клиент-серверного взаимодействия для передачи файлов в .NET. Он легко расширяется и может служить фундаментом для создания более сложных систем обмена файлами и сетевых приложений.
Здравствуйте, у меня есть пара вопросов по отправке файла на другие компьютеры, как я могу связаться с вами, чтоб задать их?