Пример приема и передачи файла по сети C#

Вы этой статье я покажу как можно создать клиентско серверное приложение для передачи файлов по сети.

Для начала напишем проект для передачи файла:

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

Как это работает:

  1. Сервер запускается и начинает слушать порт 5000.
  2. Клиент подключается к серверу и отправляет файл send_file.txt.
  3. Сервер сохраняет файл как received_file.txt.

Советы по улучшению:

  • Добавьте протокол: имя файла, размер, подтверждения.
  • Используйте async/await для асинхронной передачи.
  • Добавьте многопоточность для обработки нескольких клиентов.
  • Реализуйте авторизацию и шифрование при передаче.

Вывод

Это базовый пример клиент-серверного взаимодействия для передачи файлов в .NET. Он легко расширяется и может служить фундаментом для создания более сложных систем обмена файлами и сетевых приложений.

1 комментарий

Оставить комментарий
  1. Здравствуйте, у меня есть пара вопросов по отправке файла на другие компьютеры, как я могу связаться с вами, чтоб задать их?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.