عرض سلام خدمت کاربران عزیز ، در این ساعت از فکر بکر آموزش بسیار کاربردی سوکت پروگرمینگ (socket) را برای شما ارائه خواهم داد.
در این آموزش فایلی را در شبکه با استفاده از سوکت و پروتکل TCP ارسال و دریافت میکنیم.
آدرس کانال فکر بکر در تلگرام : https://Telegram.me/learningprograming
کار را شروع میکنیم.
در این برنامه دو اپلیکیشن برای ارسال و دریافت فایل ایجاد میکنیم.
ابتدا پروژه را ایجاد میکنیم و نام آنرا sendFiles قرار میدهیم. و سپس فرم را بصورت زیر طراحی میکنیم.
کدهای زیر را جهت انتخاب فایل مینویسیم.
private void btnOpenFile_Click(object sender, EventArgs e)
{
OpenFileDialog op = new OpenFileDialog();
if(op.ShowDialog()==DialogResult.OK)
{
txtFile.Text = op.FileName;
}
}
در این قسمت فضای نامهای زیر را جهت استفاده از سوکت و فایل به برنامه اضافه میکنیم.
using System.IO;
using System.Net;
using System.Net.Sockets;
جهت ارسال فایل کدهای زیر را درج میکنیم.
private void btnSendFile_Click(object sender, EventArgs e)
{
Socket Sosend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint IPE = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
Sosend.Connect(IPE);
//--------------------------------------
FileStream Fs = new FileStream(txtFile.Text, FileMode.Open);
byte[] bfile = new byte[Fs.Length];
Fs.Read(bfile, 0, bfile.Length);
Sosend.Send(bfile);
}
در قطعه کد بالا ما از با دستور AddressFamily.InterNetwork در واقع از IPV4 استفاده کردیم. و با دستور SocketType.Stream نوع سوکت را بصورت جریانی از داده انتخاب کردیم و در پایان با دستور ProtocolType.Tcp نوع پروتکل جهت ارسال فایل TCP می باشد.
کلاس IPEndPoint نیز جهت اتصال به سروری که قرار است فایل را دریافت نماید با پورت مشخص مورد استفاده قرار میگیرد.
با استفاده از کلاس FileStream فایل مورد نظر را در حالت خواندن باز میکنیم و سپس جهت ارسال فایل آنرا به آرایه ای از byte تبدیل مینماییم و در پایان با استفاده از متد Send فایل مورد نظر در شبکه ارسال خواهد شد.
اکنون پروژه ی دیگری جهت دریافت فایل با نام ReceiveFile ایجاد میکنیم و فرم آنرا بصورت زیر طراحی میکنیم.
در این پروژه جهت دریافت فایل باید از thread استفاده نماییم تا برنامه همواره در حال اجرا و قابل دسترس باشد. لذا تابع زیر را جهت دریافت فایل مینویسیم و سپس توسط یک thread تابع مورد نظر را اجرا میکنیم . پس از اجرای تابع برنامه منتظر میماند تا توسط سیستمهای در شبکه فایلی ارسال گردد و آنرا دریافت نماید.
public void Listen()
{
Socket SoListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint IPE = new IPEndPoint(IPAddress.Any, int.Parse(txtPort.Text));
SoListen.Bind(IPE);
SoListen.Listen(2);
Socket CGetFile = SoListen.Accept();
byte[] bfile = new byte[1024 * 1000000];
while (true)
{
int r = CGetFile.Receive(bfile);
if (r > 0)
{
this.Invoke(new Action(() =>
{
lblStatus.Text = "درحال دریافت فایل";
SaveFileDialog SD = new SaveFileDialog();
if (SD.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(SD.FileName, FileMode.Create);
fs.Write(bfile, 0, r);
fs.Flush();
lblStatus.Text = "فایل دریافت شد";
}
}));
Thread.CurrentThread.Abort();
}
}
}
در تابع فوق تنها نکته ای که لازم به توضیح میباشد اینست که thread نمیتواند به کنترلهای فرم دسترسی داشته باشد لذا برای حل این مشکل کدهای مورد نظر را در بلاک
this.Invoke(new Action(() =>
{
}));
قرار میدهیم.
رویداد کلیک دکمه اتصال جهت دریافت فایل را بصورت زیر مینویسیم.
Thread t = new Thread(new ThreadStart(Listen));
t.Start();
کد بالا درواقع تابع Listen را درون یک thread اجرا میکند.
جهت اجرای برنامه ابتدا پروژه دریافت فایل را اجرا کنید و بر روی دکمه اتصال کلیک کنید و سپس پروژه ارسال فایل را اجرا نمایید.
در قسمتهای بعدی آموزشهای دیگری از سوکت پروگرمینگ را برای شما کاربران عزیز ارائه خواهم داد.
آدرس کانال فکر بکر در تلگرام : https://Telegram.me/learningprograming