PDA

View Full Version : آموزش: ارسال و دریافت فایل در شبکه



silsin
شنبه 28 شهریور 1394, 18:14 عصر
با سلام
فکر کنم تا حالا چندین تاپیک با همین نام از من دیده بودین ! :لبخند: کلا می خوام رکورد تاپیک اموزشی شبکه رو بزنم توی این انجمن خخخخخخ که خب در هر کدوم به طبع یه روشی رو برای این کار در نظر گرفته بودم . در این تاپیک هم به مشابه تاپیک های قبلیم می خوام یکی از همین روش ها رو بررسی کنم . میشه گفت این روش رو چند روز اخیر در طی یکی از کارهام بهش رسیدم حال نمی کنین ؟ اخه کی میاد مجانی اینا رو یاد بده ؟ ته اش ملت میان سوکت چیست ؟ ایا خوردنی است یا پوشیدنی رو یاد میدن :لبخند:(مثلا خواستم بگم ریا نشه خخخخ ) خوشبختانه دنیای برنامه نویسی دنیای محدودی نیست و اینکه شما به هر روشی که دلت می خواد می تونی هر کاری رو انجام بدی و این هم یکی دیگه از همین نمونه هاست
اول از همه برای ارسال فایل بیاین یه ابتکار جدید به خرج بدیم . مسلما در نرم افزارهای چت دیدین که شما یه فایل رو می تونین با کشیدن و انداختن روی کادر متن یا همون (Drag and Drop) کردن ارسال کنید ما هم می خواهیم از همین ویژگی در ارسال فایل های خودمون استفاده کنیم . در بخش اول این تاپیک می خوام نحوه انجام این کار و در بخش دوم نیز چگونگی ارسال و دریافت به سمت دیگه سرور رو بررسی کنیم و همچنین در انتهای کار نیز سورس کار اصلی قرار داده خواهد شد .
قبل از هر چیزی پلن کار خودمون رو بررسی می کنیم
هدف در اینجا ارسال فایل از طریق کلاینت به سرور یا مثلا برعکس .
برای همین ما به دو سر نیاز داریم (کلاینت - سرور ) که خب اتصال و دریافت هر کدوم رو طبق موارد و دونسته های قبلی خودمون در مورد برنامه نویسی شبکه می تونیم انجام بدیم
اولین چالشی که با اون روبه رو هستیم اینه که می خوایم فایل رو با درگ دراپ کردن اماده ارسال کنیم بنابراین باید از EventHandler کادر نوشتنی خودمون استفاده کنیم
دومین چالشی که با اون روبه رو خواهیم شد اینه که اگر ما بخواهیم چند فایل رو ارسال کنیم چی ؟ چه جوری باید این کار رو بکنیم ؟
یا اگر بخواهیم فایل ها با پسوند های مختلف رو ارسال کنیم سمت دیگه چه طوری باید بفهمه که ما چی رو ارسال کردیم ؟؟
و البته در این تاپیک هم یک روش ابتکاری روبرای هدر گذاری بر روی فایل های ارسالی یاد می گیریم که چگونه کاری کنیم که در سمت گیرنده مشکلی برای شناسایی داده ها پیش نیاد مثلا اینه چه حجمی فایل ها داشته باشن (این مورد معمولا توی کارهای ساده ای مثل این نیاز نمیشه و اینکه مکانیزم هایی وجود داره که میشه از صحت ارسال اطمینان پیدا کرد فقط خواستم بگم که میشه این کار رو هم انجام داد ) یا مثلا اطلاعات فایل رو در قالب حجم فایل و یا اسمش ارسال کنیم که در سمت گیرنده بدونه چه فایلی رو داره و می خواد بگیره .
همچنین اینکه بشه فایل رو در قالب بایت در اورد یعنی اینکه میشه هر بلایی سرش در اورد (فشرده کنیم ! تیکه تیکه کنیم )
همه این مسائل رو در این تاپیک بررسی می کنیم


: : : ::

یک محیط جدید ایجاد کرده ان را به عنوان کلاینت خود در نظر می گیریم , نام گذاری مناسب را انجام می دهیم
برای اینکه بتوانیم یک فایل را از طریق درگ اند دراپ کردن اماده و ارسال کنیم ما نیاز به یکی از کنترل های ویژوال استدیو داریم
در مورد TextBox با وجود دارا بودن ویژگی AllowDrop اما تنها قادر دریافت فایل های متنی می باشد (البته تا اونجایی که من دیدم شاید بشه ولی من نتونستم پیدا کنم ) یعنی شما یک متن را با انتخاب کردن و درگ کردن می توانید وارد این TextBox کنید . ابزار مناسب دیگر با همین ویژگی RitchTextBox بوده که می توان به وسیله فعال کردن این ویژگی در ان می توان علاوه بر متن فایل نیز وارد آن کرد . این ویژگی را به وسیله EnableAutoDragDrop فعال کنید
چند Label برای نمایش وضعیت به ترتیب :
تعداد فایل
حجم فایل
مقصد
به همراه دو Button برای ارسال و اتصال وارد فرم کنید
تصویر فرم طراحی شده :
135331

اولین کاری که باید بکنیم این است که فابلیت دریافت فایل - تبدیل به باینری و اماده ارسال کردن این RitchTextBox را فعال کنیم . برای این کار وارد بخش کد نویسی شوید

richTextBox1.DragDrop += new DragEventHandler(rTextBox_DragDrop);



برای دسترسی به ویژگی DragDrop ما باید یک EventHandler تعریف کنیم
(این EventHandler به صورت پروپرتی از خاصیت های کنترل قابل دسترسی نیست (چرا؟؟))
این EventHandler را در ابتدای اجرای پروژه تعریف کنید به طوری که اول از همه اجرا شود (البته میشه این رو توی Designer.cs هم تعریف کرد اما کی حوصله دردسر داره ؟؟؟ )
اکنون متد مربوط به این رویداد را تعریف می کنیم

List<byte[]> FileBytes = new List<byte[]>();
byte[] temp;
void rTextBox_DragDrop(object sender, DragEventArgs arg)
{

string[] files = (string[])arg.Data.GetData(DataFormats.FileDrop);

foreach (string ex in files)
{
temp = File.ReadAllBytes(ex);
FileBytes.Add(temp);

FileFormats = ASCIIEncoding.Unicode.GetBytes(Path.GetExtension(e x));


}






a.Text = FileBytes.Count.ToString();
b.Text = temp.Length + " Byte";

}




- مقادیر متد :
یک Object به همراه یک EventArgs


string[] files = (string[])arg.Data.GetData(DataFormats.FileDrop);


به وسیله arg.Data.GetData مقداری که به وسیله Drag کردن ایجاد میشود را به دست می اوریم و به وسیله DataFormats.FileDrop نیز فرمت بر اساس فایلی که از ان استفاده کردیم انتخاب میشود (راحت ترین توضیح) و چون این مقدار یک مقدار رشته ای به عنوان مسیر فایل را بر می گرداند پس ما نیز از همین مقدار برای دسترسی به ان استفاده می کنیم
(بهتره بگم زمانی که دراپ رو انجام می دیم به وسیله این دستور میاد مسیر فایل رو پیدا می کنه (دلیل اینکه ارایه تعریف شده اینه که شاید چند تا فایل باشن ) )
پس از این کار اگر بخواهیم به فایل به دست امده دسترسی داشته باشیم می توانیم از این دستور استفاده کنیم




foreach (string ex in files)
{
temp = File.ReadAllBytes(ex);
FileBytes.Add(temp);

FileFormats = ASCIIEncoding.Unicode.GetBytes(Path.GetExtension(e x));


}




در اینجا ما به صورت ایندکس به ایندکس به مقادیر به دست اماده در ارایه files دسترسی پیدا می کنیم
با File.ReadBytes نیز به فایل به دست امده , دسترسی بایتی خواهیم داشت (یعنی زمانی که از این دستور استفاده کنیم فایل به صورت بایت وارد متغییر tempما خواهد شد )
و همچنین این مقدار به دست امده را نیز در لیست بایتی FileBytes قرار می دهیم
بدین گونه ما فایل های حاصل از درگ و دراپ کردن را دریافت و به قالب بایت در اورده و سپس وارد لیست بایتی خود برای ارسال در اینده می کنیم

پایان بخش اول .....

juza66
شنبه 21 آذر 1394, 21:59 عصر
سلام

کمابقیش کووووووووووووو؟

لطفا ادامه بدید

policweb
یک شنبه 22 آذر 1394, 03:09 صبح
سلام واقغن کارتون بینظیره
مثال کار شما مثل برنامه زاپیا نسخه دسکتاپش هست
لطفا در صورت امکان پایان هر بخش فایل پروژه را هم قرار بدید چون اینجوری خوانای کدا پایین میاد
بازم خیلی ممنون از اموزش کاربری و مفید
منتظر قسمتهای بعدی هستیم