fmo_82

سلسلة دروس C# Network Programming

237 ردود في هذا الموضوع

الأمثلة الخاصة بدرس السادس :

SMTP & POP3 Programming

امثلة الدرس السادس.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكراً جزيلاً

تم التحميل بنجاح!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي الحبيب

بارك الله لك ما خطت يداك

أقسم لك أني لم اتأثر من أي شئ في المنتدي كما تأثرت من هذه الدروس

وأطلب من السادة المشرفين تثبيت الموضوع للأهمية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشكرك اخي الكريم C#please على دعمك الكبير ... سوف نتحدث في الدرس القادم عن برمجة ال HTTP ويعتبر هذا الدرس نقلة نوعية لتعلم برمجة الشبكات كوننا سنتعامل مع web Server و جهاز Client كما يمكننا استخدام ال XML لنقل عملية التخاطب بينهما .. انتظرونا في هذا الدرس القادم والذي يعتبر درس اكثر من مهم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم ,

الدرس السابع: HTTP – Hyper Text Transfer Protocol Programming

تتلخص وظيفة ال HTTP بشكل عام على انه البرتوكول المستخدم لتوصيل طلب المستخدم User Request إلى الويب سيرفر ثم قيام ال web server بالرد على ال Request والذي يسمى ب Server Response وبتأكيد تستطيع نقل جميع أشكال ال (Multimedia) من النص وصورة و صوت و فيديو وغيره .. من ال Web Server إلى ال Client Application باستخدام Byte Stream object.

يعمل برتوكول ال HTTP على ال Application Layer وهذا يعني استخدامه بشكل مباشر من واجهة المستخدم كما هو الحال في DNS,SMTP,POP3,FTP انظر إلى الشكل التالي:

web.gif

أولا : Downloading From Web Server

نستطيع التعامل مع ال Web Server في الدوت نيت باستخدام الكلاس WebClient الموجود في النيم سبيس System.Net إذ تقدم لنا جميع الإمكانيات لتوصيل طلب الزبون و الرد عليهUser Request & Server Response وتدعم ال WebClient Class ثلاثة Methods لتحميل البيانات من ال Web Server وهي:

1- DownloadData ووظيفتها جلب البيانات من ال Web Server وتخزينها في Byte Array وتعرض على شكل HTML Code وتستخدم كما يلي كمثال :

using System;
using System.Net;
using System.Text;
class DownloadData_Method
{
public static void Main ()
{
 WebClient wc = new WebClient();
 byte[] response = wc.DownloadData("http://www.google.com");
 Console.WriteLine(Encoding.ASCII.GetString(response));
}
}

2- DownloadFileووظيفتها نقل ملف ما من ال Web Server وتخزينها مباشرة في Local Computer وهو سهل الاستخدام جدا إذ ما عليك سوا تمرير موقع الملف والمكان الذي تريد تخزين الملف فيه ويستخدم كما يلي كمثال :

using System;
using System.Net;

class DownloadFile_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
string filename = "C:\\ra.zip";

Console.WriteLine("Download in Progress Please Waite...");

wc.DownloadFile("http://www.personalmicrocosms.com/zip/ra.zip", filename);

Console.WriteLine("file downloaded");
}
}

3- OpenRead ووظيفتها إنشاء Read Only Stream بين الزبون والسيرفر لجلب بيانات من URL محدد وتخزينه في Stream Object بعد تمرير ال URL للموقع الذي تريد عرضه وباستخدام الميثود ReadLine نستطيع عرض البيانات المخزنة في ال Stream Object على شكل HTML Code .

ملاحظة : تستخدم الميثود Peek لمعرفة نهاية ال Stream Object .

using System;
using System.IO;
using System.Net;

class OpenRead_Method
{
public static void Main ()
{
 WebClient wc = new WebClient();
 string response;

 Stream strm = wc.OpenRead("http://www.google.com");
 StreamReader sr = new StreamReader(strm);

 while(sr.Peek() > -1)
 {
 response = sr.ReadLine();
 Console.WriteLine(response);
 }
 sr.Close();
}
}

ويحتوي ال WebClient Class على مجموعة من ال Properties والتي تستخدم لجلب معلومات عن ال Web Host مثلproperty ResponseHeaders والذي يستخدم لجلب معلومات هامة عن ال web host مثل عدد ال Headers ونوع ال cash control واسم ال Server و نوع ال Encoding المستخدم وغيرها من المعلومات الهامة, ويستخدم كما يلي كمثال:

using System;
using System.Net;

class ResponseHeaders_property
{
public static void Main ()
{
 WebClient wc = new WebClient();
 byte[] response = wc.DownloadData("http://www.google.com");
 WebHeaderCollection whc = wc.ResponseHeaders;
 Console.WriteLine("header count = {0}", whc.Count);
 for (int i = 0; i < whc.Count; i++)
 {
 Console.WriteLine(whc.GetKey(i) + " = " + whc.Get(i));
 }
}
}

//Output:
//header count = 6
//Cache-Control = private
//Content-Type = text/html
//Set-Cookie = PREF=ID=6ae22f44980c5d78…
//7JRA; expires=Sun, 17-Jan-2038 19:14:
//Server = GWS/2.1
//Transfer-Encoding = chunked
//Date = Wed, 23 Nov 2005 10:10:58 GMT

ثانيا : Uploading to Web Server

يدعم ال WebClient أربعة Methods لتحميل البيانات إلى ال Web Server وهي :

1- OpenWrite ويستخدم لإرسال Stream Data إلى ال Web Server وذلك بعد تمرير عنوان ال URL للملف والنص الذي نريد كتابته على ال Web Page طبعا يجب أن تملك الصلاحيات لذلك ويستخدم كما يلي كمثال :

using System;
using System.IO;
using System.Net;
class OpenWrite_method
{
public static void Main ()
{
 WebClient wc = new WebClient();
 string data = "<h1>Welcome to My Page</h1>";
 Stream strm = wc.OpenWrite("C:\\mypage.html");
 StreamWriter sw = new StreamWriter(strm);
 sw.WriteLine(data);
 sw.Close();
 strm.Close();
}
}

2 – UploadData ويستخدم لنقل محتويات مصفوفة من النوع Byte إلى ال Web Server وهذا يعني انك تستطيع من خلالها رفع أي نوع من البيانات مثل النص الصور الفيديو وغيره إلى ال web server بعد تحويلها إلى Byte Array ويستخدم كما يلي كمثال :

using System;
using System.Net;
using System.Text;

class UploadData_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
string data = "This is The Text Before Converted it to Byte";
byte[] dataarray = Encoding.ASCII.GetBytes(data);
wc.UploadData("C:\\mydata.txt", dataarray);
}
}

3- UploadFile وتستخدم هذه الميثود لرفع ملف من ال Local Computer إلى ال Web Host وهي بسطة الاستخدام جدا وتستخدم كما يلي كمثال :

using System;
using System.Net;

class UploadFile_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
wc.UploadFile("http://www.yoursite.com", "C:\\myfile.html");
}
}

4- UploadValues وتستخدم لرفع Collection من البيانات وال values الخاصة بها إلى الويب سيرفر وذلك بعد تحويل ال Collection إلى Byte Array ولتعريف Collection نستخدم الكلاس NameValueCollection الموجود في النيم سبيس System.Collections.Specialized وبعد تعريفه نستخدم الميثود add لإضافة ال Collection جديد.. وتستخدم كما يلي كمثال :

using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;

class UploadValues_Method
{

public static void Main ()
{
 WebClient wc = new WebClient();
 NameValueCollection nvc = new NameValueCollection();
 nvc.Add("firstname", "Fadi");
 nvc.Add("lastname", "Abdel-qader");
 byte[] response = wc.UploadValues("http://localhost/mypage.aspx", nvc);
 Console.WriteLine(Encoding.ASCII.GetString(response));
}
}

ثالثا :المواضيع الأكثر تقدما في ال HTTP Programming:

يعتبر هذا الجزء من أهم الأجزاء في برمجة تطبيقات Web Client Applications والذي سوف نتحدث فيه عن استخدام كل من ال HttpWebRequest Class و ال HttpWebResponse Class :

1- استخدام HttpWebRequest Class :

يحتوي هذا الكلاس على مجموعة من ال Properties والتي تستخدم بشكل أساسي في تطبيقات ال Web Client Applications لإنشاء مثل :

1- استخدام خاصية ال Web Proxy : والتي نمرر فيها عنوان ال Proxy Server ورقم البورت حتى نستطيع التعامل مع ال HTTP Web Requestsمن خلف Proxy Server أو Firewall ويتم تعريف ال Proxy Server Prosperity كما يلي كمثال :

using System;
using System.Net;

class ProxyServer_Property
{
public static void Main ()
{
 HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(
 "http://www.google.com");

 WebProxy proxysrv = new WebProxy("http://proxy1.server.net:8080");
 hwr.Proxy = proxysrv;

}
}

نعرف في البداية ال HttpWebRequest Object ثم نعرف WebProxy Object من الكلاس webProxy ونسند له عنوان ال Proxy Server ورقم البورت وبعد ذلك نستطيع إسناده إلى أي اوبجكت باستخدام الخاصية Proxy التي تكون موجودة عادة في جميع HttpWebRequest Objects ..

2- استخدام ال HttpWebrequest لإرسال بيانات إلى الويب سيرفر باستخدام ال Streams وتستخدم كما يلي كمثال :

HttpWebrequest hwr = (HttpWebRequest)WebRequest.Create("http://localhost");
Stream strm = hwr.GetRequestStream();
StreamWriter sw = new StreamWriter(strm);
sw.WriteLine(data);

بعد تعريف ال HttpWebRequest Object نقوم بتعريف Stream Object ونسند له ال Request Stream من خلال الميثود GetRequestStream .

2 - استخدام HttpWebResponse Class:

تستخدم ال HttpWebResponse Object لإرجاع بيانات من الويب سيرفر إلى ال Client حيث نستخدم الميثود GetResponse و الميثود BeginGetResponse لهذه العملية ولا يوجد فرق في وظيفة هذه الميثودس سوى أن BeginGetResponse تعتبر asynchronous Method .

يحتوي ال HttpWebResponse Object على عدد من ال Properties وهي :

1- CharacterSet : وتستخدم لتحديد نوع ال Character Set

2- ContentEncoding : وتستخدم لعملية ال encoding

3- ContentLength : وتستخدم لمعرفة حجم الرد

4- ContentType : لتحديد نوع ال Respone

5- Cookies : لتعامل مع ال Cookies ولستخدامها يجب أولا إنشاء ملف Cookie فارغ وتعريفه كما يلي كمثال :

HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://www.amazon.com");

hwr.CookieContainer = new CookieContainer();

وذلك قبل ال HTTP Request ثم نسنده إليه كما يلي :

HttpWebResponse hwrsp = (HttpWebResponse)hwr.GetResponse();
hwrsp.Cookies = hwr.CookieContainer.GetCookies(hwr.RequestUri);

6- Headers : لمعرفة ال HTTP Headers

7- LastModified : يرجع فيه وقت وتاريخ أخر تعديل

8- Method : لمعرفة الميثود والتي تستخدم في ال HTTP Response

9 – ProtocolVersion : لمعرفة ال HTTP Version

10 – ResponseUri : ال URL الخاص بسيرفر

11 – Server : لمعرفة اسم السيرفر

12 – StatusCode : لمعرفة نوع ال Coding امستخدم

13 – StatusDescription : لإرجاع Text يحتوي على حالة ال HTTP

في الدرس القادم سوف نتحدث عن الProgramming Web Services & XML إن شاء الله ..

لتحميل كافة الدروس انظر التوقيع :rolleyes:

لتحميل الدرس اللأخير على شكل PDF File :

L7 HTTP Programming.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

لتحميل كافة الدروس : :)

من الدرس الأول إلى الدرس السابع على شكل PDF - File

C# Network Programming Chapter1(0.8).rar

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا يا أستاذ فادي على هذه الدروس القيمة ..وكان عندي سؤال اش وضع ارسال رسائل sms من النت طبعا عن طريق برنامج استنادا على برنامج ارسال الايميلات اللي حضرتك شرحته في المثال السابق.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشكرك اخي الكريم , بنسبة لل SMS فلابد من ان يتوفر لدك SMS Gateway انظر المشاركة التالية فسوف تجد فيها ما يفيدك :

كيف أجعل البرنامج يرسل SMS

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخ العزيز فادى ، أود ان أشكرك على هذه الدروس القيمه جدا ، واتمنى منك الاستمرار فى شرح ما يتعلق ببرمجة الشبكات .

ولى سؤال : قمت بتنصيب الـ IIS على ويندوز اكس بى لأعداد ويب سيرفر - وكما تعلم انه لابد للويب سيرفر من Static IP حتى يمكن الوصول اليه من اى مكان

ولكن المشكله اننى داخل شبكه ADSL للمشاركة فى الانترنت وكما تعلم فان الراوتر يعمل عن طريق الـ NAT ولذلك لا يوجد IP حقيقى لجهازى .

حاليا الحل الوحيد أمامى هو الـ Port Forwarding ولكنى عندما قمت بعمل ذلك للبورت 80 الخاص بالـ HTTP لم يعمل أيضا ،، ولكنى عرفت ان معظم مزودى خدمة الانترنت يحجبون هذا البورت ( من الخارج ) لمعظم المستخدمين العاديين حتى لا يتمكنوا من جعل اجهزتهم سيرفرات ،، ارجو المساعده او اقتراح حل .

وشكرا جزيلا لك ،،،

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

سلا م من السلام عليكم ورحمة منه وبركات

أخي الفاضل : فادي

لك جزيل الشكر و الإمتنا ن على جزيل عطاياك في هذا الموضوع

و إلى الأمام وفقنا ووفقك الله لما يحبه و يرضاه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
الأخ العزيز فادى ، أود ان أشكرك على هذه الدروس القيمه جدا ، واتمنى منك الاستمرار فى شرح ما يتعلق ببرمجة الشبكات .

ولى سؤال : قمت بتنصيب الـ IIS  على ويندوز اكس بى لأعداد ويب سيرفر - وكما تعلم انه لابد للويب سيرفر من Static IP  حتى يمكن الوصول اليه من اى مكان

ولكن المشكله اننى داخل شبكه ADSL للمشاركة فى الانترنت وكما تعلم فان الراوتر يعمل عن طريق الـ NAT  ولذلك لا يوجد  IP حقيقى لجهازى .

حاليا الحل الوحيد أمامى هو الـ Port Forwarding  ولكنى عندما قمت بعمل ذلك للبورت 80 الخاص بالـ HTTP  لم يعمل أيضا ،، ولكنى عرفت ان معظم مزودى خدمة الانترنت يحجبون هذا البورت ( من الخارج ) لمعظم المستخدمين العاديين حتى لا يتمكنوا من جعل اجهزتهم سيرفرات ،، ارجو المساعده او اقتراح حل .

وشكرا جزيلا لك ،،،

اعتقد ان هذه هى نفس المشكله التى تواجهنى تماما

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخوة الأعزاء nanoeng و bmsaa2002 و IOException اشكر لكم تواجدكم واعتذر عن انشغالي الشديد في الفترة السابقة , بنسبة لعملية ال Port Forwarding فلا اعتقد ان مزودي الإنترنت لهم القدرة على ايقافها وخاصة انه يتم برمجتها من داخل الراوتر , على اي حال سوف يساعدك هذا الموقع بإعداد ال Port Forwarding لديك:

http://www.portforward.com وبعتقادي ان هذا هو الحل الأمثل .. ارجو الإطلاع ايضا على هذا الموضوع :

Running a Home Webserver without a Static IP

انتظرونا في الدرس القادم قريبا جدا :rolleyes:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

أول ما أبدء به هو الشكر لصاحب هذه المقالات والقائمين على هذا المنتدى الرائع وأعضائه الكرام

من كتاب

C# Network Programming

by Richard Blum ISBN:0782141765

Sybex © 2003 (647 pages)

بعد قرائتي لهذه المواضيع الشيقة من أستاذنا الكبير وجدت أنه تم نسيان ذكر عيوب البرمجة في الـ TCP

فأتمنى أن تقبلوا مني هذا العمل البسيط لينضم إلى هذا الصرح الكبير

نعلم مسبقاً ان البيانات المستقبلة تبقى في مخزن داخلي حتى نقوم بستدعاء وظيفة قرائئة من ذلك المخزن

      byte[] data = new byte[1024];
     client.Receive(data)
    string stringData = Encoding.ASCII.GetString(data, 0, 1024);
       

1- أول شئ سوف نتحدث عنه للكود السابق هو قمنا بقرائة 1024 بايت من المخزن تخيل لوكان في المخزن مجموعة آخرى من البيانات سوف تبقى حتى نقوم بستدعاء الكود مرى آخرى

سوف تعقب على كلامي أنني أستطيع أن أقوم بحلقة وأستدعي الكود داخلة هنا تتولد لدينا مسكلة أخرى وهي كم عدد البيتات الفعلي المقروء من قبل العملية وهنا يجب أن ننوه أن كتب الكود ليستقبل مثل هذه الحالة وهي طول المخزن الذي نقوم بتخزين البيانات فيه وقصر البينات المرسلة فبذلك يصبح الكود كما يليك

      byte[] data = new byte[1024];
     int ReadCount = client.Receive(data)
    string stringData = Encoding.ASCII.GetString(data, 0, ReadCount );        

2- المعاناة الآخرى التي سوف تواجهك في هذ البرمجة هو طول الرسالة التي تود قرائتها لحل مثل هذه المشكلة هناك حلين

الحل الأول : هو أن نقوم بتحديد طول مسبق لرسالة المقروئة:

      const int MESSAGE_LENGHT = 512;
     byte[] data = new byte[MESSAGE_LENGHT ];
     int ReadCount = client.Receive(data)
    string stringData = Encoding.ASCII.GetString(data, 0, ReadCount );        

هنا في كل مرة نستدعي في هذا الكود نقوم بقراءة رسالة واحدة

الحل الثاني: أن نقوم بستخدم حجوم عشوائية نقوم تعريف الحجم في أول كل رسالة كود الإستقبال

private static byte[] ReceiveVarData(Socket s)
 {
  int total = 0;
  int recv;
  byte[] datasize = new byte[4];
  recv = s.Receive(datasize, 0, 4, 0);
  int size = BitConverter.ToInt32(datasize);
  int dataleft = size;
  byte[] data = new byte[size];
  while(total < size)
  {
    recv = s.Receive(data, total, dataleft, 0);
    if (recv == 0)
    {
     data = Encoding.ASCII.GetBytes("exit ");
     break;
    }
    total += recv;
    dataleft -= recv;
  }
  return data;
 }

وهنا كود الإرسال

private static int SendVarData(Socket s, byte[] data)
 {
  int total = 0;
  int size = data.Length;
  int dataleft = size;
  int sent;
  byte[] datasize = new byte[4];
  datasize = BitConverter.GetBytes(size);
  sent = s.Send(datasize);
  while (total < size)
  {
    sent = s.Send(data, total, dataleft, SocketFlags.None);
    total += sent;
    dataleft -= sent;
  }
  return total;
 }

الحل الثالث: أن نقوم بستخدم أحد العلامت لإنهاء الرسالة وهنا نقوم بقرائة البينات بايت بايت مما وعند العثور على بايت العلامة نقوم بإرسال الرسالة إلى البرنامج ولكن هذا الحل سوف يقوم بإضافة التعقيد على برنامجنا

وبدلاً من قيامنا بكتابة نظام تعريف على علامتنا التي وضعناها زود في مكتبة الـ #C بعض من الـ Class لتقوم بتسهيل مهمة القرائة والكتابة وهو NetworkStream وهذا ما شرحة أستاذنا الفاضل بدروسه السابقة

وإن شاء الله في الأيام القادمة سوف نقوم بشرح لأخطاء الـ UDP

راجين من الله الفائدة للجدميع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

اود في البداية شكر اخي TarekNajem04 على مجهوداته الرائعة والحقيقة ان المنتدى ونحن متعطشون إلى وجود عضو من امثاله ,

يعتبر ما ذكره زميلي الأخ طارق نجم احدى عيوب الإرسال و الإستقبال بستخدام المصفوفة بحيث لا تدري الحجم الحقيقي لرسالة لكن تم التغلب على هذه المشكلة بستخدام مكتبات ال Stream و وبدون استخدام المصفوفات كما يلي للإرسال :

TcpClient myclient = new TcpClient (txt_host.Text,5020);
NetworkStream myns = myclient.GetStream ();
StreamWriter mysw = new StreamWriter (myns);
mysw.WriteLine(txt_msg.Text);

وفي عملية الإستقبال كما يلي :

mytcpl = new TcpListener (5020); // Open The Port
mytcpl.Start ();// Start Listening on That Port
mysocket = mytcpl.AcceptSocket ();// Accept Any Request From Client and Start a Session
myns = new NetworkStream (mysocket); // Receives The Binary Data From Port
mysr = new StreamReader (myns);  // Convert Received Data to String
Textbox1.Text =  mysr.ReadLine(); // Print The Message
mytcpl.Stop();

وفي هذه الطريقة تحاشينا الوقوع في المشاكل التي تواجهنا في استخدام المصفوفات لكن يمكننا استخدام الطريقتين معا اي بوجود مصفوفة مع استخدام مكتبات الستريم وكما يلي لإرسال صورة من جهاز إلى اخر :

openFileDialog1.ShowDialog ();
string mypic_path =openFileDialog1.FileName;

MemoryStream ms = new MemoryStream();// Store it in Binary Array as Stream
pictureBox1.Image = Image.FromFile(mypic_path);
pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat);
byte[] arrImage = ms.GetBuffer();
ms.Close();

TcpClient myclient = new TcpClient (txt_host.Text,5000);//Connecting with server
NetworkStream myns = myclient.GetStream ();
BinaryWriter  mysw = new BinaryWriter (myns);
mysw.Write(arrImage);

اذ اننا لم نحتاج الى تحديد حجم المصفوفة وكتفينا بتعريفها فقط , اشكرك اخي طارق على هذه الملاحظات القيمة واتمنى ان تكون دائما عضو فعال معنا ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

الدرس الثامن: Web Services Programming

تحدثنا في الدرس السابق عن برمجة ال HTTP وبينا فيه كيفية التفاعل بين ال web server وال client ويعتبر هذا الدرس مكمل لما تحدثنا عنه سابقا, تتلخص وظيفة استخدام ال web services بإمكانية الاستفادة من ال Methods الموجودة بال web server داخل برنامج الزبون وباستخدام برتوكول ال SOAP وهو اختصار ل Simple Object Access Protocol يتم نقل ال Result من ال web Services server إلى ال Client بعد تحويلها إلى ال XML - extensible Markup Language حيث تنقل عبر برتوكول ال HTTP إلى جهاز الزبون والهدف من استخدامه هو تسهيل وصول ال Data من ال web server إلى ال Client من خلال ال firewalls والبيئات المختلفة إذ أن جميع بيئات الشبكات تدعم برتوكول ال HTTP والذي يعمل على البورت 80 . ولا تختلف لغة ال XML عن ال HTML إذ تستخدم نفس القواعد في ال HTML وهي مجموعة من الElements وال Attributes مثل ال </> <> لكن تتميز بمرونة اكبر وكمثال عليها :

   <myStuff>
 <myName>FADI Abdel-qader</myName>
 <myTelephone>+962796...</myTelephone>
 <myEmail>fadi822000@yahoo.com</myEmail>
 <myAge>23</myAge>
 <mySex>M</mySex>
</myStuff>

ويتم استدعائها في الدوت نيت باستخدام النيم سبيسس System.xml حيث يتم قراءتها باستخدام الميثود Load الموجود في ال XmlDocument Class كما يلي :

using System.Xml;
// Then you can Read any XML File as Below:
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"C:\myinfo.xml");
XmlNodeList name = xDoc.GetElementsByTagName("myName");
XmlNodeList telephone = xDoc.GetElementsByTagName("myTelephone");
XmlNodeList email = xDoc.GetElementsByTagName("myEmail");
XmlNodeList age = xDoc.GetElementsByTagName("myAge");
XmlNodeList sex = xDoc.GetElementsByTagName("mySex");

MessageBox.Show(
    "Name: " + name[0].InnerText +"\n"+
    "Telephone: " + telephone[0].InnerText +"\n"+
    "Email: "+ email[0].InnerText +"\n"+
    "Age: "+ age[0].InnerText +"\n"+
    "sex: "+ sex[0].InnerText +"\n"

تمر عملية استخدام ال web services بثلاثة مراحل وهي :

1- The web service server : والذي يتم من خلاله إرسال واستقبال البيانات عبر برتوكول ال SOAP باستخدام ال IIS وال ASP.NET .

2- The proxy object : والذي يسمح لل Client بإرسال و استقبال البيانات من وإلى ال web Services Server حيث يتم تعريفه في ال HttpWebRequest من خلال الكلاس WebProxy وهو ما بينته في الدرس السابق.

3- The client application : وهو الواجهة الخاصة بزبون والتي يتم ربطها بال Web Services Server

انظر إلى الشكل التالي :

33918083661.jpg

ولإنشاء web services server نقوم بعمل مشروعWeb Services ASP.NET جديد ونستدعي النيم سبيسس System.Web.Services ثم نقوم بتوريث الكلاس WebService للكلاس الرئيسي للمشروع وكما يلي كمثال:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://my_url.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
   public Service () {}
   [WebMethod]
 public int Add(int a, int b)
 {
  return a + b;
 }

   }

حيث يتم استقبال قيمتين A و B وبعد ذلك يقوم بإرجاع ناتج جمع القيمة الأولى مع القيمة الثانية إلى ال Client على شكلXML باستخدام برتوكول ال SOAP وكما يظهر في الشكل التالي :

33918094727.jpg

33918110966.jpg

ولإنشاء برنامج ال Client يجب أولا تحويل الكلاس السابق إلى Dll File و إرفاقه بال Client Resources ويتم استخدامه كما يلي :

using System;
class Client_side
{
   public static void Main(string[] argv)
   {
       My_main_class mm = new My_main_class();
       int x = Convert.ToInt16(argv[0]);
       int y = Convert.ToInt16(argv[1]);
       int sum = mm.Add(x, y);
       Console.WriteLine(sum);
   }
}

قد بينت هنا الأساسيات في برمجة ال web Services وسيتم الخوض في التفاصيل لاحقا إن شاء الله .. سوف نتحدث في الدرس القادم عن برمجة ال FTP Programming ..

لتحميل كافة الدروس انظر التوقيع

لتحميل الدرس الأخير :

Web_Services.pdf

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه


int y = Convert.ToInt16(argv[1]);
int x = Convert.ToInt16(argv[0]);

اعتقد انها Convert.ToInt32

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا على الدرس المفيد

اريد ان استوضح عن الattribute ده

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

وما هى ConformsTo

وشكرا :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اخي العزيز IOException يتم إدراج هذه الattribute تلقائيا عند انشاء مشروع Web Services جديد وهي تستخدم بشكل اساسي في حالة إذا احتجت استخدام اكثر من XML Web service method حيث يتم تحديدها بستخدام الخاصية ConformsTo ,

ولمزيد من المعلومات انظر الرابط التالي :

http://msdn.microsoft.com/library/default....eclasstopic.asp

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

الدرس التاسع FTP – File Transfer Protocol Programming :

سوف نبدأ هنا بشرح برتوكول أخر من برتوكولات ال Application Layer وهو برتوكول ال FTP والذي يستخدم بشكل أساسي في عملية تنزيل downloading و رفع uploading الملفات من و إلى ال FTP Server وكالعادة في اغلب برمجيات الشبكات و التي تعتمد على وجود Client/Server حيث يقوم السيرفر بتصنت على البورت المخصص لل FTP وهو البورت 21 باستخدام ال TCP Connection Oriented Protocolحيث يبقى السيرفر بوضع الانتظار لورود طلب من ال Client بإنشاء Session معه وبعد إجراء عمليات التحقق Authentication والتأكد من الصلاحيات يتم الموافقة على البدء بالجلسة حيث يتم تحديد رقم البورت والذي سوف يتم استقبال البيانات من خلاله ويتم الإرسال إلى جهاز الزبون عبر البورت 20 في السيرفر وتتضح هذه العملية كما في الشكل التالي :

34320163693.jpg

لتفعيل خدمة ال FTP لديك بحيث يعمل جهازك ك FTP Server يجب أولا التأكد من أن ال FTP Services مثبتة لديك مع ال IIS و كما يظهر في الشكل التالي :

34320200613.jpg

ومن ثم التأكد من تفعيلها ب Services من Control Panel ثم Administrative Tools ثم Services وكما يظهر في الشكل التالي :

34320211420.jpg

ثم التأكد منه في ال IIS بحيث يظهر كما في الشكل التالي :

34320225710.jpg

أولا : FTP Commands

تشبه عملية الاتصال و الاستخدام لل FTP عملية ال Telnet إلى حد كبير حيث يدعم برتوكول ال FTP مجموعة من الأوامر والتي يتم من خلالها عملية التخاطب مع السيرفر أو مع ال Remote Host وتضح هذه العملية كما في الشكل التالي :

34320250579.jpg

وهنا شرح لأهم ال Commands FTP:

34320272890.jpg

ثانيا : التعامل مع ال FTP في الدوت نيت باستخدام COM Components :

تدعم الدوت نيت استخدام ال FTP عبر ITC – Internet Transfer Control وهو جزء من ال COM Components Controls وللبدء قم بإنشاء New Windows Application كما في الشكل التالي :

34320283851.jpg

ثم قم بإضافة النيم سبيسس التالية :

using System.IO;
using System.Reflection;

ثم إضافة الكود التالي إلى ال Upload Button :

private void button1_Click(object sender, System.EventArgs e)
{
FileInfo thisFile = new FileInfo(tbFile.Text);
Type ITC;
object[] parameter= new object[2];
object ITCObject;
ITC = Type.GetTypeFromProgID("InetCtls.Inet");
ITCObject = Activator.CreateInstance(ITC);
parameter[0] = (string)tbServer.Text;
parameter[1] = (string)"PUT " + thisFile.FullName + " /" + thisFile.Name;
ITC.InvokeMember("execute", BindingFlags.InvokeMethod,null, ITCObject, parameter);
}

تم في البداية تعريف ال ITC من خلال ال Type Class والموجود ضمن النيم سبيس System.Reflection ثم عرفنا Array من النوع Object وذلك لاستخدامها في تمرير اسم الملف و ال FTP Server إلى الميثود InvokeMember والموجودة ضمن ال ITC Control Object ...

سوف تجد الملف الذي سيتم رفعه في المجلد :

C:\Inetpub\ftproot

ثالثا : التعامل مع ال FTP في الدوت نيت باستخدام ال Web Class :

يمكن برمجة ال FTP باستخدام web Class والموجودة ضمن النيم سبيسس System.Net وتشبه عملية التعامل معه كما في التعامل مع الWebRequest و ال webResponse Classes و التي تعاملنا معها في برمجة ال HTTP حيث يمكننا الاستفادة منها لتعامل مع ال FTP Protocol وهي كما يلي :

- WebClient إذ تم دعم dot net Framework 2 استخدام الكلاس WebClient والذي يدعم التعامل مع ال FTP والذي يتم استدعائه من النيم سبيسس System.Net ويتم تعريفه كما يلي :

using System;
using System.Net;

namespace Web_Client
{
   class Program
   {
       public static void Main(string[] args)
       {
           string filename = "ftp://ms.com/files/dotnetfx.exe";
           WebClient client = new WebClient();
           client.DownloadFile(filename, "dotnetfx.exe");

       }

   }
}

- FtpRequestCreator ويستخدم لتسجيل وبدأ العمل مع ال FTP ويعرف كما يلي :

using System;
using System.Net;

namespace FTP
{
   public class FtpRequestCreator : IWebRequestCreate
   {
       public FtpRequestCreator()
       {
       }

       public System.Net.WebRequest Create(System.Uri uri)
       {
           return new FtpWebRequest(uri);
       }
   }
}

- FtpWebRequest ويستخدم لعمل download or upload a file on an FTP server ويتم تعريفها كما يلي :

using System;
using System.Net;

namespace FTP
{
   public class FtpWebRequest : WebRequest
   {
       private string username = "Fadi";
       internal string password = "fff";
       private Uri uri;
       private bool binaryMode = true;
       private string method = "GET";

       internal FtpWebRequest(Uri uri)
       {
           this.uri = uri;
       }

       public string Username
       {
           get { return username; }
           set { username = value; }
       }

       public string Password
       {
           set { password = value; }
       }

       public bool BinaryMode
       {
           get { return binaryMode; }
           set { binaryMode = value; }
       }

       public override System.Uri RequestUri
       {
           get { return uri; }
       }

       public override string Method
       {
           get { return method; }
           set { method = value; }
       }

       public override System.Net.WebResponse GetResponse()
       {
           FtpWebResponse response = new FtpWebResponse(this);
           return response;
       }
   }
}

- FtpWebResponse ويستخدم لعملية الرد من قبل السيرفر ويتم تعريفها كما يلي:

using System; 
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace FTP
{
   public class FtpWebResponse : WebResponse
   {
       private FtpWebRequest request;
       private FtpClient client;

       internal FtpWebResponse(FtpWebRequest request)
       {
           this.request = request;
       }
   }
}

- FtpWebStream ويستخدم لتعريف ال Stream والذي سوف يستخدم لعملية النقل ويعرف بشكل مبدئي كما يلي :

using System; 
using System.IO;
using System.Net.Sockets;

namespace FTP
{
   internal class FtpWebStream : Stream
   {
       private FtpWebResponse response;
       private NetworkStream dataStream;

public FtpWebStream(NetworkStream dataStream, FtpWebResponse response)
       {
           this.dataStream = dataStream;
           this.response = response;
       }
   }
}

رابعا : مثال تطبيقي لرفع ملف من جهاز Client إلى جهاز Server باستخدام ال Stream وال Socket:

في هذا الجزء سوف نقوم بإنشاء برنامجين Client / Server وبتعامل مع ال Stream Library سوف نقوم بتحويل الملف إلى Byte Array و إرساله عبر ال Stream باستخدام ال Socket و TCP Connection , ولبرمجة الجزء الخاص بالإرسال أو ال Client قم بإنشاء مشروع جديد كما في الشكل التالي :

34320370342.jpg

سوف نستخدم النيم سبيسس التالية :

using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

في ال Send Button قم بكتابة الكود التالي :

try
{
Stream fileStream = File.OpenRead(textBox1.Text);
// Alocate memory space for the file
byte[] fileBuffer = new byte[fileStream.Length];
fileStream.Read(fileBuffer, 0, (int)fileStream.Length);
// Open a TCP Connection and send the data
TcpClient clientSocket = new TcpClient(textBox2.Text,8880);
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Write(fileBuffer,0,fileBuffer.GetLength(0));
networkStream.Close();
}
catch (Exception ex){MessageBox.Show(ex.Message);}

قمنا في البداية بقراءة الملف الذي نود إرساله وتخزينه ب Stream Object وحتى نستطيع إرساله عبر ال Socket لابد من تحويله إلى مصفوفة من النوع Byte وقمنا بتسميته ب fileBuffer ثم تعبئته باستخدام الميثود Read والموجودة ضمن fileStream وبعد ذلك قمنا بإنشاء اتصال مع ال Server باستخدام ال TCP Connection حيث تم إرسال محتويات ال fileBuffer إلى ال Server باستخدام NetworkStream Class ...

ولبرمجة جزء Server وهو المسئول عن استقبال الملف وتخزينه قم بإنشاء مشروع جديد كما يظهر في الشكل التالي :

34320374651.jpg

سوف نستخدم النيم سبيسس التالية :

using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;

ثم قم بكتابة ميثود جديدة وليكن اسمها handlerThreadوكما يلي :

public void handlerThread()
{
Socket handlerSocket = (Socket)alSockets[alSockets.Count-1];
NetworkStream networkStream = new
   NetworkStream(handlerSocket);
int thisRead=0;
int blockSize=1024;
Byte[] dataByte = new Byte[blockSize];
lock(this)
{
// Only one process can access
// the same file at any given time
Stream fileStream = File.OpenWrite(@"c:\upload");

while(true)
 {
thisRead=networkStream.Read(dataByte,0,blockSize);
fileStream.Write(dataByte,0,thisRead);
if (thisRead==0) break;
fileStream.Close();
 }
  lbConnections.Items.Add("File Written");
  handlerSocket = null;
 }

ثم قم بكتابة ميثود أخرى جديدة وذلك لفتح TCP Connection على البورت 8880 وهو افتراضي والتصنت عليها وليكن اسمها listenerThreadوكما يلي :

public void listenerThread()
{
TcpListener tcpListener = new TcpListener(8880);
tcpListener.Start();
while(true)
{
Socket handlerSocket = tcpListener.AcceptSocket();
if (handlerSocket.Connected)
 {
lbConnections.Items.Add(handlerSocket.RemoteEndPoint.ToString() + " connected.");
lock (this)
 {
 alSockets.Add(handlerSocket);
 }
ThreadStart thdstHandler = new
  ThreadStart(handlerThread);
Thread thdHandler = new Thread(thdstHandler);
thdHandler.Start();
 }
}
}

ثم قم بإضافة الكود التالي إلى حدث بدأ تشغيل البرنامج Form Load :

private void Form1_Load(object sender, System.EventArgs e)
{
IPHostEntry IPHost = Dns.GetHostByName(Dns.GetHostName());

lbConnections.Text = "My IP address is " +
IPHost.AddressList[0].ToString();

alSockets = new ArrayList();

Thread thdListener = new Thread(new ThreadStart(listenerThread));
thdListener.Start();

}

باستخدام ال Thread تم تنفيذ ال listenerThread Method والتي قمنا فيها بتعريف ال tcpListener وتفعيله على البورت 8880 حيث سيتم قبول أي طلب يأتي من ال Client على هذا البورت وبعد ذلك استدعاء الميثود handlerThread والتي سيتم فيها استقبال ال Stream Data وتخزينها في Byte Array ثم قراءتها وتخزينها في المكان المحدد وباستخدام ال fileStream.Write حيث مررنا له ال Stream والذي يحتوي على اسم الملف thisRead وال dataByte Array...

FTP_Programming.rar

FTP_Examples.rar

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

وهنا قد تم الانتهاء من ال Chapter1 وفي الجزء التالي من هذه السلسلة سوف نتحدث عن أمور أكثر تقدما في برمجة الشبكات وسوف نأتي على بعض الجزيئيان ونفصلها بشكل اكبر إن شاء الله مثل :

Stream Libraries

Network Layer Programming

Remotting

Threading and the Asynchronous Pattern

Security & Authentications

لتحميل ال Chapter 1 تسعة دروس :

http://d.turboupload.com/d/204050/C_Networ...apter1.rar.html

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم ,

الدرس العاشر: Managed I/O: Streams, Readers, and Writers :

تحدثنا سابقا في الجزء الأول بشكل عام عن استخدامات ال Streams Library واستخدامها لإرسال Binary Data و Text Data من جهاز إلى آخر وكمثال قمنا بإرسال صورة من ال Client إلى ال Server باستخدام ال Stream Reader & Stream Writer ..

إن الهدف من إنشاء مكتبات ال Stream هو تسهيل عملية نقل البيانات من مكان إلى أخر سواء عبر الشبكة أو داخل نفس الجهاز كما هو الحال بتعامل مع الملفات أو التعامل مع الطابعة أو أي طرفية أو جهاز آخر موصول بالكمبيوتر حيث تسهل علينا عملية تحويلها إلى Byte Array وإرسالها وهو ما حل الكثير من المشاكل التي كانت تواجه المبرمجين في التعامل مع Binary Data ..

يمكن التعامل مع ال Stream بأسلوبين المتزامن Synchronous والغير متزامن Asynchronous وبشكل افتراضي تعمل جميع ال IO Streams بالأسلوب المتزامن لكن العيب فيه هو تأثيره الشديد على أدائية النظام إذ يقوم بإغلاق الProcessing Unit في ال Thread المخصصة للبرنامج بحيث لا يسمح بتنفيذ أي أمر آخر إلا بعد الانتهاء من العملية الجارية ولا ينصح ابدآ استخدام الأسلوب المتزامن في حالة إذا كنت تتعامل مع أجهزة قراءة وكتابة بطيئة نسبيا مثل ال Floppy Disk أو ال Magnetic Tape لكنها مهمة جدا بالبرمجيات التي تعتمد على أنظمة الزمن الحقيقي أو ال Real Time Systems حيث أنها تعتمد الأسلوب المتزامن في عملية إرسال واستقبال البيانات وهو ما يمنع القيام بأي عملية أخرى إلى حين الانتهاء من تنفيذ الأمر ومن الأمثلة عليها أنظمة السحب أو الإيداع في الرصيد البنكي أو أنظمة حجز التذاكر أو شحن بطاقة الهاتف وغيرها .. طبعا في حالة إذا كان برنامجك لا يحتاج إلى وجود الخواص السابقة عندها ينصح باستخدام الأسلوب الغير متزامن Asynchronous حيث تستطيع من خلاله تنفيذ عمليات أخرى في وحدة المعالجة وبدون الحاجة لانتظار إنهاء العملية الجارية إذ يتم إنشاء Separate thread لكل عملية طلب إدخال أو إخراج مما لا يؤثر على أدائية النظام وينصح باستخدامه إذا كانت عملية القراءة أو الكتابة تجرى من خلال أجهزة بطيئة نسبيا ويمكن تميز الميثود المتزامن عن الغير متزامن في الدوت نيت بوجود كلمة Begin أو End في بداية اسم الميثود الغير متزامن وكمثال عليها BeginWrite و BeginRead و ال EndWrite و ال EndRead ..

أولا: Stream Classes

تدعم الدوت نيت عمليات ال Streams بمجموعة من ال Classes والمندرجة تحت النيم سبيسس System.object و System.IO والتي تستخدم لعمليات نقل البيانات ال Binary Data . تستخدم بعض ال Stream Classes , Backing storage , ومن الأمثلة عليها FileStream و ال BufferedStream وال MemoryStream وكذلك فإن بعضها لا يستخدم أي Back Storage ومن الأمثلة عليها ال NetworkStream والتي تستخدم لنقل ال Stream عبر الشبكة وبدون استخدام Backing Storage , و تقسم ال Stream Classes في الدوت نيت كما في الشكل التالي :

34919464574.jpg

1- BufferedStream Class : ويستخدم بشكل أساسي لحجز مقدار معين من الذاكرة بشكل مؤقت لتنفيذ عملية معينة كما تستخدم بعض البرمجيات ال Buffering لتحسين الأدائية حيت تكون كذاكرة وسيطة بين المعالجة و الإرسال أو الاستقبال وكمثال عليها برمجيات الطباعة حيث تستخدم الطابعة ذاكرة وسيطة لتخزين البيانات المراد طباعتها بشكل مؤقت , يكمن الهدف الأساسي من استخدام ال Buffering في العمليات التي يكون فيها المعالج أسرع من عمليات الإدخال و الإخراج حيث يتم معالجة البيانات ووضعها في ال Buffer في انتظار إرسالها وهو ما يساهم في تحسين الأدائية بشكل كبير , ويستخدم ال BufferedStream عادتا في برمجيات الشبكات مع ال NetworkStream لتخزين البيانات المراد إرسالها عبر الشبكة في الذاكرة حيث لا يستخدم هذا الكلاس Backing storage كما ذكرنا سابقا ..

بشكل افتراضي يتم حجز 4096 bytes عند استخدام ال BufferedStream ويمكن زيادتها أو تقليلها حسب الحاجة .. ويستخدم ال BufferedStream كما يلي كمثال :

using System;
using System.Text;
using System.IO;
namespace Network_Buffering
{
   class Program
   {
       static void Main(string[] args)
       {
           ASCIIEncoding asen = new ASCIIEncoding();
           byte[] xx = asen.GetBytes("Hello Buffering");

           MemoryStream ms = new MemoryStream(xx);
           readBufStream(ms);
       }
 public static void readBufStream(Stream st)
     {
      // Compose BufferedStream
BufferedStream bf = new BufferedStream(st);
byte[] inData = new Byte[st.Length];

// Read and display buffered data
bf.Read(inData, 0, Convert.ToInt32(st.Length));
Console.WriteLine(Encoding.ASCII.GetString(inData));
       }
   }
}

حيث قمنا بتحويل نص إلى Byte Array باستخدام ال ASCIIEncodingوتحميله في عبر ال MemoryStream ثم ارسلناه إلى الميثود readBufStream والتي انشأناها حيث استقبلنا من خلالها ال Stream وحملناه في ذاكرة مؤقتة بستخدام الكلاس ال BufferedStream ثم قمنا بطباعة محتوياته بعد تحويله إلى نص مرة اخرى بستخدام الEncoding.ASCII وطباعته ..

2- MemoryStream Class : وهو شبيه بعملية ال Buffring السابقة إذ يعتبر كحل جيد لتخزين البيانات بشكل مؤقت في الذاكرة قبل الإرسال أو الأستقبال حيث يغنيك عن تخزينها على شكل ملف مما يسرع العملية بشكل كبير ويستخدم كما يلي كمثال حيث استخدمنها لتخزين صورة في الذاكرة :

MemoryStream ms = new MemoryStream(); 
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

byte[] arrImage = ms.GetBuffer();
ms.Close();

3- NetworkStream Class : وكما قمنا باستخدامها سابقا , حيث تقوم بتعامل مع ال Stream لإرساله عبر الشبكة باستخدام ال Socket ويتم استدعائها من النيم سبيسس System.Net.Sockets ويعتبر الكلاسNetworkStream بأنه unbuffered إذ لا يحتوي على Backing Storage ويفضل استخدام ال BufferedStream Classمعه لتحسين الأداء وتستخدم كما يلي كمثال حيث نريد إرسال الصورة التي قمنا بتخزينها في المثال السابق بذاكرة إلى جهاز أخر عبر ال Socket :

TcpClient myclient = new TcpClient (“localhost”,5020);//Connecting with server

NetworkStream myns = myclient.GetStream ();

BinaryWriter  mysw = new BinaryWriter (myns);
mysw.Write(arrImage);//send the stream to above address
mysw.Close ();
myns.Close ();
myclient.Close ();

4- FileStream : يتم استدعائها باستخدام النيم سبيسس System.IO وتستخدم بشكل اساسي في التعامل مع الملفات سواء للكتابة إلى ملف أو القراءة من ملف وتعتبر هذه الكلاس Backing Storage Class حيث تستخدم ذاكرة Buffer لتحزين البيانات بشكل مؤقت في الذاكرة لحين الإنتهاء من عملية الكتابة أو القراءة ومن الأمور الهامة فيها تحديد مسار الملف المراد القراءة منه أو الكتابة عليه وتستخدم كما يلي :

FileStream FS = new FileStream(@"C:\MyStream.txt",
FileMode.CreateNew);// Any Action For Example CreateNew to Create Folder

يمكننا استخدام ال Enumeration التالية مع ال FileMode :

34919493759.jpg

1- Append لإضافة نص ما إلى الملف الموجود اصلا

2- Create لإنشاء ملف جديد ويقوم بعمل overwriting في حالى إذا كان الملف موجود بشكل مسبق

3- CreateNew وهو كما في ال Create إلا انه يعطي Exception في حالة وجود الملف بشكل مسبق

4- Open لقراءة ملف ما حيث يعطي Excption في حالة عدم وجود الملف المحدد

5- OpenOrCreate في حالة إذا وجد الملف يقوم بقراءته وفي حالة عدم وجوده يقوم بإنشائه.

6- Truncate ويستخدم لحذف محتويات الملف وجعله فارغا

ثانيا : Stream Members :

هنالك مجموعة من الخواصو و المييثودس التي تشترك بها مكتبات ال Stream وهي كما يلي :

34919513071.jpg

1- CanRead و CanWrite وتستخدم لمعرفة إذا كان ال Stream المستخدم يقبل عملية القراءة أو الكتابة أم لا حيث ترجع قيمة True في حالة إذا كان يقبل و False في حالة أنه لا يقبل ويستخدم عادة قبل إجراء عملية القراءة أو الكتابة لفحص مدى الصلاحية قبل المحاولة ..

2- CanSeek حيث يستخدم ال Seeking عادة لتحديد موقع ال Current Stream والعادة تدعم الكلاسات التي تستخدم Backing Storage هذه العملية مثل ال FileStream وعندها ترجع قيمة True وترجع قيمة false في حالة إذا كان ال Stream Class لا يحتوي على Backing Storage .

3- CanTimeout وترجع قيمة True في حالة إذا كان ال stream يحتوي على خاصية ال Timeout والتي تعطي وقت محدد للعملية .

4- Length وتستخدم لمعرفة حجم ال Stream بال Byte ويمكن الاستفادة منها لمعرفة نهاية ال Stream أو لتحديد حجم المصفوفة بناء على حجم ال Stream .

5- Position وتستخدم ال Get و Set لمعرفة أو تحديد الموقع ل Stream

وتشترك مكتبات ال Stream بمجموعة من الميثودس وهي كما يلي :

1-الميثودس المتزامنة Synchronous Methods :

I. Read و ReadByte وتستخدم لقراءة Stream Data وتخزينه في ال Buffer ويمكن تحديد عدد البايتات التي سيتم قراءتها باستخدام ال ReadByte كما نستطيع من خلالها معرفة نهاية ال Stream حيث ترجع ال Read قيمة 0 وال ReadByte قيمة -1 في حالة انتهاء ال Stream.

II. Write وال WriteByte وتستخدم لعملية الإرسال عبر ال Stream ويمكن تحديد عدد البايتات التي سيتم كتابتها في كل مرة باستخدام ال WriteByte.

2-الميثودس غير المتزامنة Asynchronous Methods :

I. BeginRead وال BeginWrite وتستخدم لعملية القراءة أو الكتابة باستخدام ال Stream الغير المتزامن وتأخذ خمسة باروميترات كما في الشكل التالي :

34919545356.jpg

1- ال Byte Buffer والتي سوف تستخدم لعملية القراءة منه أو الكتابة عليه

2- ال offset والذي سوف يحدد فيه موقع القراءة أو الكتابة

3- ال numByte والذي سوف يتم فيه تحديد الحد الأقصى من البايتات التي سيتم كتابتها أو قراءتها

4- ال AsyncCallback وهو Optional Delegate حيث يتم استدعائه عند الانتهاء من عملية القراءة أو الكتابة

5- ال Stateobject وهي User Provided Object وتستخدم لتميز ال Read & Write Request عن غيره ال Requests .

ترجع ال Begin Methods ال IAsyncResult والذي يمثل حالة ال Stream Operation .

II. EndRead وال EndWrite وتستخدم في حالة إذا أردنا تنفيذ ال Stream Operation بعد الانتهاء من ال Stream Operation الحالي, حيث يبقى بانتظار انتهاء العملية السابقة ثم ينفذ العملية المطلوبة

وهناك بعض الميثود والتي تستخدم لإدارة ال Stream وهي :

1- Flush وتستخدم لتفريغ محتويات ال Buffer بعد إتمام العملية المحددة حيث يتم نقل محتويات ال Buffer إلى ال Destination الذي تم تحديده في Stream Object.

2- Close وتستخدم لإغلاق ال Stream وتحرير ال Resources المحجوزة من قبل ال Stream Object وينصح باستخدامها في الجزء الخاص ب Finally block ولتأكد من أن ال Stream سيتم إغلاقه وتحرير كافة الموارد في حالة حدوث أي Exception إثناء التنفيذ ولضمان عدم بقاء هذه الموارد في الذاكرة بعد إغلاق البرنامج.

3- SetLength وتستخدم لتحديد حجم ال Stream والذي نريد إرساله أو استقباله لكن في حالة إذا كان ال Stream أقل من المحدد في ال SetLength سوف يؤدي ذالك إلى انقطاع ال Stream وعدم وصوله بشكل سليم , لن تستطيع استخدام هذه الخاصية إلا إذا تأكدت انك تملك الصلاحية لذلك من خلال الخاصية CanWrite و CanSeek لذا ينصح بفحص الصلاحية أولا قبل تحديد حجم ال Stream .

ثالثا : Stream Manipulation:

يمكن استخدام مكتبات ال Stream لنقل Binary Data أو Text وفي العادة يتم استخدام ال BinaryReader و ال BinaryWriter لتعامل مع ال Binary Data ويتم استخدام ال StreamReader وال StreamWriter لتعامل مع ال Text ,

ويتم استخدام ال ASCIIEncoding أو UnicodeEncoding لتحويل من Stream إلى Text عند الاستقبال ومن Text إلى Stream عند الإرسال حيث تستخدم مجموعة من الميثودس وهي كما في الشكل التالي :

34919570962.jpg

1- GetByteCount وهي Overloaded Method حيث تأخذ Character Array أو String وترجع عدد البايتات التي سوف نحتاجها لنقل نص معين ..

2- GetBytes لتحويل ال String إلى Byte Array حتى نستطيع إرسالها باستخدام ال Stream .

3- GetCharCount حيث تأخذ Byte Array وترجع عدد الأحرف التي سوف تكون في ال String أو في ال Character Array .

4- GetChars وتستخدم لتحويل من Byte Array إلى String وتستخدم عند استقبال البيانات من ال Stream حيث نحولها إلى نص مرة أخرى .

ولتعامل مع ال StreamReader و ال StreamWriter لنقل Text يجب أولا استدعائها من ال System.IO نيم سبيسس وتستخدم كما يلي:

StreamReader للقراءة من ملف:

StreamReader str = File.OpenText(openFileDialog1.FileName);
textBox1.Text = str.ReadToEnd();

StreamWriter للكتابة إلى ملف:

string fname = saveFileDialog1.FileName;
StreamWriter fsave = new StreamWriter(fname);
fsave.WriteLine(textBox1.Text);

و لتعامل مع ال BinaryReader وال BinaryWriter لنقل Binary Data يتم استدعائها من ال System.IO نيم سبيسس وتستخدم كما يلي:

BinaryReader لقراءة Binary Data من ال Stream:

NetworkStream myns = new NetworkStream(mysocket);
BinaryReader br = new BinaryReader(myns);

BinaryWriterr لإرسال BinaryData إلى ال Stream عبر ال Socket:

TcpClient myclient = new TcpClient("localhost", 5020);
NetworkStream myns = myclient.GetStream();
BinaryWriter mysw = new BinaryWriter(myns);
mysw.Write(arrImage);

Remote Control Example باستخدام ال Stream Reader & Writer:

مثال تطبيقي بسيط سوف نستخدم فيه برنامج شبيه ب Chatting لكن سوف نستخدمه لإعطاء أوامر إلى ال Server حيث يفترض إذا قمنا بإرسال كلمة notepad إلى ال server بأن يقوم بفتح ال notepad فيه وإذا قمنا مثلا بكتابة Calc وإرسالها إلى السيرفر سوف يفتح الآلة الحاسبة فيه وهكذا :

أولا : إنشاء برنامج الإرسال Client : لا يختلف برنامج الإرسال عن برنامج ال Client Chat الذي قمنا بإنشائه في ال Chapter1 ويستخدم فيه كل من TCP Connection وال NetworkStream و ال StreamWriter لإجراء عملية الإرسال فباستخدام الميثود WriteLine الموجودة ضمن ال StreamWriter Object تتم عملية تحويل النص المكتوب في ال Textbox إلى مجموعة من ال Bytes ليتم إرسالها باستخدام ال NetworkStream عبر ال TCP Socket Connection إلى برنامج السيرفر وللبدء قم بإنشاء مشروع جديد كما في الشكل التالي :

34919593177.jpg

ثم قم بإضافة النيم سبيسس التالية :

using System.Net.Sockets;
using System.IO;

في Send Button قم بكتابة الكود التالي:

try
{
TcpClient myclient = new TcpClient (txt_host.Text,5020); // تعريف السوكت
NetworkStream myns = myclient.GetStream (); // إسناده إلى اللستريم اوبجكت
StreamWriter mysw = new StreamWriter (myns);
mysw.WriteLine(txt_msg.Text);

mysw.Close ();
myns.Close ();
myclient.Close ();
}
catch (Exception ex) {MessageBox.Show (ex.Message );}

ولإنشاء برنامج ال Server والذي يعمل على استقبال ال Stream وتحويله إلى Text مرة أخرى .. قم بإنشاء مشروع جديد كما في الشكل التالي :

34920010757.jpg

قم بإضافة النيم سبيسس التالية :

using System.Net.Sockets;
using System.IO;
using System.Threading;

ثم إضافة التعاريف التالية :

TcpListener mytcpl;// Objects  Declaration 
Socket mysocket;
NetworkStream myns;
StreamReader mysr;

ثم نقوم بإنشاء ميثود جديدة كما يلي :

void our_Server ()
 {
mytcpl = new TcpListener (5020);// Open The Port
mytcpl.Start ();// Start Listening on That Port
mysocket = mytcpl.AcceptSocket ();// Accept Any Request From Client and Start a Session
myns = new NetworkStream (mysocket);// Receives The Binary Data From Port
mysr = new StreamReader (myns);// Convert Received Data to String
string order = mysr.ReadLine();

// you can add any order and Response Here
if (order=="notepad") System.Diagnostics.Process.Start("notepad");  
else if (order=="calc") System.Diagnostics.Process.Start("calc");
else MessageBox.Show("Sorry Sir Your Request is not in my hand",order);

mytcpl.Stop();// Close TCP Session
 
if (mysocket.Connected ==true)// Looping While Connected to Receive Another Message
{
while (true)
{
our_Server ();// Back to First Method
}
}
}

حيث تقوم هذه الميثود بتصنت على ال Socket في حالة ورود أي Request يقوم بالموافقة عليه وإنشاء Session جديدة معه وفي حالة ورود أي بيانات عبر السوكت يتسلمها باستخدام ال StreamReader ويحولها إلى Text ثم نقوم بفحص الرسالة باستخدام الجمل الشرطية فمثلا إذا كانت الرسالة هي notepad يتم استدعائها باستخدام الميثود Start الموجودة ضمن الكلاس Process والموجودة في النيم سبيسس System.Diagnostics...

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

 private void Form1_Load(object sender, System.EventArgs e)
{
Thread myth;
myth= new Thread  (new System.Threading .ThreadStart(our_Server));
myth.Start ();
}

ثم قم بإضافة التالي في حدث ال Form Closing وذلك لتأكد من إغلاق السوكت وال Stream في البرنامج ..

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

وهنا قد تم الانتهاء من شرح ال Stream وال Stream Class في الدرس القادم سوف نتحدث عن ال Network Layer Programming والتي سوف نتطرق فيها إلى أمور اكثر تقدما في برمجة TCP وال UDP ..

_L10__Streams.pdf

Simple_Remote_Control.zip

C__Network_Programming_Chapter1.pdf

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

الدرس الحادي عشر: Socket & Network Layer Programming :

في هذا الجزء سوف نبين بشكل أكثر تفصيلا عن برمجة طبقة ال Network Layer وهي التي يتم التعامل معها لإرسال واستقبال البيانات بعد تحويلها من و إلى Stream عبر الشبكة, قمنا سابقا باستخدام ال TCP و UDP للإرسال وللاستقبال وبينا الفرق بينهما وفي هذا الجزء سوف نتحدث عن ال Socket Programming وال TCP & UDP Classes وفي النهاية سوف نتحدث عن Asynchronous Socket .

أولا: Socket Programming

من المعروف أن السوكت هي الأداة التي يتم نقل البيانات من خلالها من جهاز إلى أخر ولاستخدامها يلزم في البداية تعريف النيم سبيس System.Net.Sockets حيث يحتوي هذا النيم سبيس على عدد ضخم من ال Classes والتي يتم استخدامها في برمجيات الشبكة وسوف نتحدث عن أهما وهو Socket Class إذ يمكننا بمن التعامل مع ال TCP أو ال UDP أو مع أي نوع أخر من البرتوكولات بشكل مباشر ويتكون ال Socket Object Method من ثلاثة باروميترات كما يلي:

Socket MySocket = new Socket(AddressFamily. , SocketType., ProtocolType.);

حيث يتم في الباروميتر الأول تحديد نوعية ال IP Address والذي سوف تتعامل معه ويعطيك عدد كبير من الخيارات ومنها IPX والمستخدم في شبكات ال Novel أو ATM والمستخدم في شبكات ال ATM Networks أو NetBIOS Address وغيرها ... ومن أهم هذه الخيارات الInterNetwork وهو ما نستخدمه بشكل دائم مع البرمجيات الخاصة بالشبكات ويعرف على أن نوع IP هو من النوع IPv4 وهو المعتاد مع نظام مايكروسوفت وأغلب أنظمة التشغيل المعروفة حاليا وفي المستقبل القريب جدا سيتم الإستغناء عنه وليحل محله ال IPv6, في الباروميتر الثاني يتم تحديد نوع ال Socket أي هل سوف نستخدم Stream لإرسال البيانات أو شيء اخر وعادة ما يتم استخدام ال Stream لهذه المهمة حيث اننا سنعتمد نمطية التراسل من النوع Stream , وأخيرا نحدد نوع البروتوكول المستخدم للإتصال فهل هو من النوع UDP أو TCP أو بروتوكولات أخرى مثل ICMP Internet Control Message Protocol أو IGMP Internet Group Management Protocol أو اننا نريد مثلا إنشاء ال Socket لتعريف IP Security Header بإختيار IPSecAuthenticationHeader وغيرها وسوف نأتي على شرح مثل هذه الأمور لاحقا إن شاء الله, وهنا سوف نختار ال TCP أو UDP ومن المعروف أن برتوكول ال TCP هو برتوكول موجه وهذا يعني إجراء عملية التحقق من الوصول والتوصيل إلى شخص ما محدد أما برتوكول ال UDP فهو برتوكول سريع نسبيا و لكنه لا يدعم عملية التحقق من الوصول السليم للبيانات المرسلة وهو مفيد جدا لإجراء عملية البث الإذاعي Broadcast وإنشاء مجموعات البث Multicast Group وهو ما شرحناه في الدرس الأول والثاني أنظر إلى الشكل التالي ويبين فيه ال Header الخاص بال TCP وال Header الخاص بال UDP ولاحظ الفرق بينهما:

أولا ال TCP Header ويتكون من 32 Bits للبكت الواحد حيث يتم فيه تخزين عنوان المرسل في 16 Bits والمستقبل في 16 Bits والرقم التسلسلي للبكت في 32 Bits ورقم التحقق بالإضافة إلى ال Checksum وفي النهاية يتم وضع الجزء الخاص بالبيانات :

35520034230.gif

Data Offset: 4 bits the number of 32 bit words in the TCP Header.  This indicates where the data begins.  The TCP header (even one including options) is an integral number of 32 bits long.
Window: The number of data octets beginning with the one indicated in the acknowledgment field which the sender of this segment is willing to accept.

ثانيا ال UDP Header ويتكون من 32 Bits من البيانات للبكت الواحد ويحتوي على عنوان المرسل 16 Bits أما المستلم و ال Checksum فهما اختياريان وبشكل افتراضي لا يتم استخدامهم في عملية الإرسال:

35520075494.jpg

The Checksum in UDP Header. 16 bits.
Computed as the 16-bit one's complement of the one's complement sum of a pseudo header of information from the IP header, the UDP header, and the data, padded as needed with zero bytes at the end to make a multiple of two bytes. If the checksum is cleared to zero, then checksuming is disabled. If the computed checksum is zero, then this field must be set to 0xFFFF.

استخدام ال Socket Programming لإنشاء TCP Connection :

تمر عملية الاتصال باستخدام ال TCP Socket Connection بمجموعة من المراحل وهي كما في الشكل التالي :

35520102832.jpg

إذ تبدأ العملية في ال Client و ال server بإنشاء ال Socket كما يلي :

Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

ثم ربط ال Socket مع الكمبيوتر الحالي باستخدام الميثود Bind وتستخدم فقط عند الاستقبال وكما يلي :

IPEndPoint ip = new IPEndPoint(IPAddress.Any, 5020);
MySocket.Bind(ip);

ثم القيام بعملية التصنت على البورت المحدد باستخدام الميثود listen ويمكنك تحدد عدد الأجهزة التي سيتم قبولها ولوضع عدد غير محدد نمرر له الرقم -1 ثم نقوم بالموافقة على الاتصال باستخدام الميثود accept وكما يلي :

MySocket.Listen(-1);
MySocket.Accept();

ويتم استقبال البيانات من خلال الميثود Receive حيث تعبئ البيانات في مصفوفة من النوع Byte وكما يلي :

byte[]Received=new byte[1024];
MySocket.Receive(Received);

وهنا قمنا بإنشاء Connection من النوع TCP وبتعريفها على البورت(5020 كمثال) حيث يتم ربطها بال Socket باستخدام الميثود Bind وقمنا بتعريف Listen لا نهائي العدد -1 ..

ولتعريف برنامج الإرسال TCP Client باستخدام ال Socket لابد من تعريف السوكت مرة أخرى وإسناد عنوان السيرفر ورقم البورت بنقطة الهدف IPEndPoint ثم إرسال البيانات باستخدام الميثود Send وتتم عملية الإرسال بما تم تعريفه في ال socket حيث سنستخدم Stream Socket وكما يلي :

String str = Console.ReadLine();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] msg = asen.GetBytes(str);

Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 5020);
MySocket.Connect(remote);
MySocket.Send(msg);
MySocket.Close();

استخدام ال Socket Programming لإنشاء UDP Connectionless :

تمر عملية الاتصال باستخدام ال UDP Socket Connection بمجموعة من المراحل وهي كما في الشكل التالي :

35520152384.jpg

وتتشابه عملية الاتصال كما في ال TCP إذ تبدأ العملية في ال Client و ال server بإنشاء ال Socket كما يلي :

Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp);

ثم ربط ال Socket مع الكمبيوتر الحالي باستخدام الميثود Bind وتستخدم فقط عند الاستقبال وكما يلي :

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 5020);
MySocket.Bind(sender);

ولاستقبال البيانات نستخدم الميثود ReceiveFrom حيث نعرف في البداية End Point Reference بناء على ما تم تعريفه في السابقة ونمرره ك reference مع مصفوفة ال Byte إلى الميثود ReceiveFrom ومن ثم نستطيع تحويل المصفوفة إلى String من خلال الميثود GetString الموجودة ضمن الكلاس ASCII وكما يلي :

int recv;
byte[] data = new byte[1024];
EndPoint Remote = (EndPoint) (sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

ويتم في الإرسال استخدام الميثود SendTo حيث نمرر لها البيانات بعد تحويلها من String إلى Byte Array وحجم البيانات المرسلة إذ يمكننا معرفته من خلال الميثود Length ونوع ال Flags حيث نريد عمل Broadcast لرسالة المرسلة واخيرا نمرر له ال EndPoint Object وكما يلي:

string welcome = "Hello All";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.Broadcast, Remote);

يمكن وضع هذا الأكواد في Infinity While Loop بحيث لا تنتهي أو يمكن تحديدها بعدد معين من عمليات الإرسال والاستقبال ..

ثانيا: Socket Classes Members :

1- IPAddress Class : ويستخدم لتعريف IP Address حيث يمكن إسناده إلى ال IPEndPoint كمثال والصيغة العامة له كما يلي:

IPAddress newaddress = IPAddress.Parse("192.168.1.1");

ويمكن الإختيار بين اربعة خيارات في تحديد العنوان وهي كما يلي :

Any ويستخدم لتمثيل أي عنوان متاح على الشبكة

Broadcast ويستخدم لتمثيل البث الإذاعي لجميع الأجهزة على الشبكة

Loopback ويستخدم لتمثيل العنوان المعروف لل loopback وهو 127.0.0.1

None ويستخدم في حالة عدم وجود Network Interfase في النظام

كما يدعم مجموعة من الميثود وأهمها :

Equals يستخدم هذا الميثود بشكل عام للمقارنة بين tow Objects وهنا سيستخدم للمقارنة بين عنوانين ويرجع True إذا كانا متشابهين و False إذا كانا مختلفين.

GetHashCode وتستخدم لإرجاع العنوان إلى صيغة Hash Code

HostToNetworkOrder ويرجع الجزء الخاص بال Network من العنوان

NetworkToHostOrder ويرجع الجزء الخاص بال Host من العنوان

2- IPEndPoint Class : حيث استخدمناه لتحديد العنوان وال Port لل Host والذي نريد الاتصال به والصيغة العامة له كما يلي :

IPEndPoint end = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 5020);

مجموعة الخواص التي تدعم في ال Socket Class وهي كما يلي:

AddressFamily ويرجع مجموعة العناوين المعرفة على ال Socket

Available ويرجع حجم البيانات الجاهزة للقراءة من ال Socket

Blocking ويعطي Get أو Set لمعرفة إذا كان ال socket يستخدم ال Blocking Mode أم لا

Connected وتستخدم هذه الخاصية بكثرة لمعرفة إذا كان ال Socket متصل مع ال Remote Host أم لا

Handle ويستخدم لمعرفة نظام التشغيل الذي يتعامل مع ال Socket

ProtocolType ويستخدم لمعرفة البروتوكول الذي يستخدم في ال Socket

RemoteEndPoint ويرجع معلومات عن ال Socket الذي يستخدم مع ال Remote Host

وكمثال لاستخداماتها:

using System;
using System.Net;
using System.Net.Sockets;
class Socket_ Properties
{
   public static void Main()
   {
       IPAddress ia = IPAddress.Parse("127.0.0.1");
       IPEndPoint ie = new IPEndPoint(ia, 8000);
       Socket fmo = new Socket(AddressFamily.InterNetwork,
              SocketType.Stream, ProtocolType.Tcp);
       Console.WriteLine("AddressFamily: {0}",
              fmo.AddressFamily);
       Console.WriteLine("SocketType: {0}",
              fmo.SocketType);
       Console.WriteLine("ProtocolType: {0}",
              fmo.ProtocolType);
       Console.WriteLine("Blocking: {0}", fmo.Blocking);
       fmo.Blocking = false;
       Console.WriteLine("new Blocking: {0}", fmo.Blocking);
       Console.WriteLine("Connected: {0}", fmo.Connected);
       fmo.Bind(ie);
       IPEndPoint iep = (IPEndPoint)fmo.LocalEndPoint;
       Console.WriteLine("Local EndPoint: {0}",
               iep.ToString());
       fmo.Close();
   }
}

حيث سترجع المعلومات التالية:

AddressFamily: InterNetwork
SocketType: Stream
ProtocolType: Tcp
Blocking: True
new Blocking: False
Connected: False
Local EndPoint: 127.0.0.1:8000
Press any key to continue . . .

ثالثا: TCP & UDP Classes Members :

أولا ال Classes الخاصة بالOriented Protocol TCP Connection :

35520181216.jpg

1-Class TcpClient: حيث تحتوي على مجموعة من ال Methods وال Properties وهي كما يلي:

أولا: أهم الميثود الخاصة بها TCPClient Methods :

Connect: وتستخدم لأجراء عملية الاتصال مع ال server حيث نمرر فيها عنوان ال IP الخاص بال Server و رقم البورت وكما يلي:

TcpClient tcp = new TcpClient();
tcp.Connect(IPAddress.Parse("192.168.1.1"),5020);

Close: لإنهاء الاتصال مع ال TCP Socket.

EndConnect: لإنهاء Asynchronies Connection حيث ترجع Asynchronies Result.

GetStream: ويستخدم لقراءة ال Stream من ال Socket في عملية الإرسال و الاستقبال.

ثانيا: أهم الخصائص TCPClient Properties :

LingerState : وتأخذ get أو Set لتحديد أو معرفة ال Linger Time

NoDelay: وتأخذ get أو Set لتحديد أو معرفة إذا كان هناك وقت معين لتأخير أم لا

ExclusiveAddressUse: وتأخذ get أو Set لتحديد أو معرفة السوكت يسمح باستخدام ال Client Port أم لا.

SendBufferSize و ReceiveBufferSize: وتأخذ get أو Set لتحديد أو معرفة حجم ال Buffer المستخدم في ال stream والمعرف في TCP Client Object.

SendTimeout و ReceiveTimeout: وتأخذ get أو Set لتحديد أو معرفة الوقت المتاح لعملية الإرسال أو الإستقبال حيث يعطي Time Out في حالة أنه لم يجد الطرف الأخر خلال فترة زمنية معينة.

2-Class TcpListener: حيث تحتوي على مجموعة من ال Methods وال Properties وهي كما يلي:

35520202076.jpg

أولا: أهم الميثود الخاصة بها TcpListener Methods :

AcceptSocket: وتستخدم لقبول عملية الاتصال مع ال Client.

Start : وهي Overloaded Method حيث انه في حالة تمرير رقم إليها يتم تحديد عدد الأجهزة التي تسمح بوجودها في الطابور أو ال Qouee وبدون تحديد رقم معين يصيح ال Qouee غير محدد.

Stop : وتستخدم لإخلاق عملية التصنت ويفضل وضعها في ال Finnaly عند استخدام ال Try و ال Catch حتى يتم إخلاق التصنت في حالة حدوث أي Exception.

ثانيا: أهم الخصائص في TcpListener:

LocalEndpoint : حيث يرجع ال IP ورقم البورت المستخدم في ال LocalEndpoint المحدد.

Server: ومن خلالها نستطيع الوصول إلى كل الخصائص و الميثود في ال TCP Server والتي شرحناها سابقا مثل ال Accept وال Sendto وال Receive و Listen وغيرها

ثانيا ال Classes الخاصة بال Protocol UDP Connectionless :

1-Class UdpClient: وتستخدم لتعريف UDP Datagram Protocol Connection قمنا سابقا بتعريفها والتعامل معها وفي هذا الدرس سنبين أهم محتوياتها وهي كما يلي :

35520230191.jpg

ومن أهم الميثود والخصائص الخاصة بها :

JoinMulticastGroup و DropMulticastGroup: لضم أو إلغاء عنوان أو مجموعة من العناوين من ال Multicast Group.

EnableBroadcast: وتأخذ Get أو Set لتفعيل ال Broadcasting في ال socket.

MulticastLoopback: وتأخذ Get أو Set لمعرفة أو تحديد ال Mlticast Loopback.

2-Class MulticastOption: ويستخدم في ال Multicasting حيث يتم تخزين IP Address List لتعامل معها في Multicast Group لعمل Join و Drop لأي Multicast Group وتستخدم كما يلي كمثال لإضافة عضوية لاستقبال رسائل Multicast :

أولا نعرف ال UDP Socket وكما يلي :

mcastSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,
ProtocolType.Udp);

ثانيا نقوم بتعريف Address List ثم نسند إليها ال IP الذي نريد إدخاله في ال Group أو نجعل ال User يدخل العنوان بنفسه نربطها بالسكوت باستخدام الميثود Bind وكما يلي :

IPAddress localIPAddr = IPAddress.Parse(Console.ReadLine());
mcastSocket.Bind(IPlocal);

ثالثا نقوم بتعريف ال Multicast Option ونسند لها العنوان المحدد كما يلي:

MulticastOption mcastOption;
mcastOption = new MulticastOption(localIPAddr);

ومن ثم نضيف التغير على ال حيث تأخذ هذه الميثود ثلاثة باروميترات الأول لتحديد مستوى التغيير على IP أو على IPv6 أو على Socket أو TCP أو UDP وفي حالتنا هذه سوف نستخدم التغير على IP إذ ما نريده هو ضم IP إلى Multicast Group وفي الباروميتر الثاني نحدد نوع التغيير حيث نريد إضافة عضوية ويمكن الاختيار بين إضافة عضويه AddMembership أو إلغاء عضوية DropMembership وأخيرا نسند إليه ال MulticastOption Object والذي قمنا بإنشائه و كما يلي:

mcastSocket.SetSocketOption(SocketOptionLevel.IP,  SocketOptionName.AddMembership,mcastOption);

في الدرس القادم سوف نتحدث عن ال Asynchronous Sockets ونطبق مجموعة من الأمثلة العملية عليها إن شاء الله.

_L11__Socket___Network_Layer_Programming.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

h السلام عليكم

شكرا اخي على الدروس لاني استفدت منهن كتير

سوالي في اي تلقي الدرس علشان انزل كل درس بدرسه ودخولي النت مو كتير اريد اعرف الايام التي نزل الدرس فيه

وخصوصا الحين بتبدا الدرس 12

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اهلا وسهلا بك اخي , بانسبة لتنزيل الدروس تكون عادة كل اسبوع يوم الجمعة أو السبت وذلك حسب وقت الفراغ ..

ملاحظة إلى كل مبرمجين ال VB.NET وحتى تعم الفائدة على الجميع تستطيعون ترجمة الأكواد السابقة من C Sharp إلى VB.NET باستخدام الرابط التالي :

http://www.developerfusion.com/utilities/c...csharptovb.aspx

حيث قمت بتجربة الترجمة لأغلب الأكواد ولم يكن هنالك أي مشاكل , من الممكن وجود بعض الإختلافات في بعد أسماء ال Methods لكن في الأغلب متشابهة ولمعرفة الأسم المقابل لها في VB.NET تستطيع الضغط عليها في C# Editor والضغط على المفتاح F1 .. وأي سؤال أو استفسار بخصوص التحويل إلى ال VB.NET لهذه الأكواد انا مستعد

وتقبلوا اطيب التحيات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا على هذا الشرح الرائع والمميز

جعل ذلك في موازين حسناتك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .