الدرس الثاني: الجزء الثاني برمجة TCP/IP

عام 0 geek4arab
Spread the love

الدرس الثاني: الجزء الثاني

سوف ابدأ في هذا الجزء شرح الجزء الخاص بالسيرفر والذي يقوم بعملية التصنت على البورت واستقبال ال Stream عبر ال Binary Reader وتحويله إلى اوبجكت مرة أخرى , في هذا المثال نريد استقبال صورة وليس شيء أخر وفي هذه الحالة وفرت لدينا الدوت نيت خصائص جديدة في ال Controls الموجودة فيها ومن ضمنها خاصية Image.FromStream الخاصة ب ال PictureBox والتي تسهل علينا إمكانية عرض الصورة المرسلة من خلال Stream لكي يتم تحويلها من Binary Stream إلى صورة تعرض على ال Picturebox انظر المثال التالي :

using System.Net.Sockets; 
using System.IO;
-----------------------------
// Objects  Declaration

TcpListener mytcpl; // Declare TCP Listener
Socket mysocket; // Declare an object from Socket Class
NetworkStream myns; // 
StreamReader mysr;
-----------------------
void Image_Receiver()
  {
mytcpl = new TcpListener (5000);// Open The Port
mytcpl.Start ();// Start Listening on That Port
mysocket = mytcpl.AcceptSocket ();// Accept Any Request From Client and Start The Session
myns = new NetworkStream (mysocket);// Receive The Binary Data From Port
pictureBox1.Image = Image.FromStream(myns); // Show The Image that Resaved as Binary Stream
mytcpl.Stop();// Close TCP Session

     if (mysocket.Connected ==true)//if Connected Start Again
	{
	while (true)
	{
	Image_Receiver();// Back to First Method
	}
	}
}

ولتطبيق قم بإنشاء New Form جديد كما في الشكل التالي :

أضف الميثود السابقة في كلاس البرنامج ثم قم باستدعائها بواسطة وضع Image_Receiver()اما في ال Constructer الخاص بالبرنامج أو بحدث بدأ التشغيل الخاص بالفورم , وقم بوضع الميثود التالية في حدث Closing الخاص بالفورم :

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
	try
	{
  mytcpl.Stop ();
  Application.Exit();
	}
catch (Exception ex) {MessageBox .Show (ex.Message );}
  }

وذلك لتأكد من إغلاق السوكت عند إنهاء البرنامج ,..

قم بإضافة الكود التالي الى ال Save لكي تتمكن من تخزين الصورة المستقبلة

  private void menuItem1_Click(object sender, System.EventArgs e)
  {
 	 try
 	 {
    saveFileDialog1.ShowDialog ();
    string mypic_path = saveFileDialog1.FileName;
    pictureBox1.Image.Save(mypic_path);
 	 }
 	 catch (Exception){}
  }

قم بتشغيل البرنامج الآن …

ماذا تلاحظ !! لقد لاحظت أن البرنامج بطيء جدا لدرجة لا يمكن فيها فتح أي برنامج أخر , فكر بالسبب ..

لن أترككم تفكرون كثيرا كون أن ذلك قد يؤدي إلى تعليق الجهاز بالكامل وخاصة إذا لم يتوفر لديك الحجم الكافي من ذاكرة الرام او إذا كان المعالج لديك بطيء نسبيا .. السبب في ذلك اللوب الذي لا ينتهي وعملية التصنت على البورت والتي لا تنتهي أيضا حيث أن البرنامج يعمل على الجزء العام والمخصص لإدارة نظام التشغيل في المعالج وهذا يعني انه لا يوجد مجال لفتح برنامج جديد إذ أن الموارد جميعها محجوزة , إذا ما هو الحل ….

لقد وفرت الدوت نيت الحل لهذه المشكلة وهي باستخدام تكنولوجيا ال Threading والتي تسمح بالمعالجة المتوازية على نفس المعالج وذلك من خلال تقسيم المهام على المعالج وعمل Session منفصلة لكل برنامج وهو ما يسمى بال Multitasking.. وهنا لا يؤثر البرنامج على موارد النظام بشكل كبير انظر الشكل التالي :

لاحظ انه قبل اضافة ال Thread كان البرنامج يعمل على منطقة ال Global Area وهذا هو سبب البطء الشديد وبعد استخدام ال Thread تم عمل Session خاص للبرنامج بحيث يعمل بشكل متوازي مع بقية البرامج ..

ولاستخدام ال Thread في البرنامج يلزم أولا تعريف المكتبة او انيم سبيس الخاص به وهو

 using System.Threading;

ثم قم باشتقاق اوبجكت منه وادرج اسم الميثود الذي تريد عمل Thread له كما يلي : اكتب هذا الكود في حدث بدأ التشغيل للفورم Form1_Load

Thread myth;
myth= new Thread  (new System.Threading .ThreadStart(Image_Receiver));
myth.Start ();

ألان قم بإضافة Application.ExitThread في حدث ال Closing Form كما يلي

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
	try
	{
  mytcpl.Stop ();
  Application.ExitThread ();
  Application.Exit();
	}
catch (Exception ex) {MessageBox .Show (ex.Message );}
  }

ميزة ال Thread رائعة جدا اذ تمكنك من تشغيل اكثر من Thread وفي نفس الوقت وفي نفس البرنامج وهو ما يسمى بال Multithreading والذي سأتي على شرحه لاحقا بإذن الله …. انتظرونا في الدرس القادم .. أتمنى منكم التطبيق.

تم تعديل بواسطه fmo_82

الكاتب geek4arab

geek4arab

مواضيع متعلقة

التعليقات مغلقة