تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس 12- شرح تقنية WCF والتخصص بال Sockets مع مثال
#1
[b]كاتب الموضوع : Tarek Aldwire

[/b]السلام عليكم ورحمة الله وبركاته...
اليوم وفي أول درس من المستوى المتوسط أولا سوف نقوم بشرح ال WCF بشكل عام ثم التخصص بالSockets


أولا: WCF : Windows Communication Foundation

هي تقنية جديدة مقدمة من Microsoft للبرامج التي تعمل في الإتصال مع شبكات أو مع كومبيوترات أخرى ... مثل برامج الحادثة (( أي تقنية للربط بين جهازين ما ))

- ما هي مجالات إستخدام ال WCF ...
لا تظن أن تقنية ال WCF ظهرت من أجل غرض فقط بل يمكنك من خلالها القيام ب WebService وذلك كما سوف ترى في الدروس القادمة...

أن العمل على المجال العام للربط بين الأجهزة أو ماشابه ذلك يتم في المجال System.Runtime.Remoting

ولكن نحن لن نستخدمه أبدا لأننا سوف نستخدم شيئ أقوى من هذا المجال العام لهذا الغرض وهو ال Sockets ....


البداية مع ال Sockets:
لأدخلك من باب رائع في إستخدام ال Sockets أولا عليك فهم ما يلي:

1- IP Address :
وهو عنوان بروتوكول الإنترنت ويكون ال ip لكل كومبيوتر غير متصل بشبكة هو 127.0.0.1
أما الكمبيوتر المتصل بشبكة فسوف يكون رقم ما غير معين...

2- Port:
وهي المنفذ الذي يقوم البرنامج بالإنتظار بينما يقوم البرنامج الاخر بالإتصال على هذا المنفذ وتكون ال Port من تحديدك مثلا 1220...

- تكوينة برامج الإتصال...

أولا يجب أن تفهم مايلي:
1- أن كل برنامج من هذا النوع يتألف من Server و Cilent (( خادم و عميل ))
2- ما الخادم والعميل إلا برنامجان متصلان مع بعضهم البعض بواسطة IP Address و Port موحدة...
3- إن العميل هو الذي يرسل البيانات للخادم لكي يتم تنفيذ ما تريد...
4- إن الخادم مهمته إنتظار العميل بينما يقوم بالإتصال به عبر ال IPAddress الخاص بالجهاز الذي يملكه الخادم.


- مثال بسيط...

قم بإنشاء مشروع WindowsFormApplication جديد وسميه Cilent ...

وفتح ال Visual Studio مرة أخرى وقم بإنشاء مشروع Console Application جديد...

الان إذهب إلى ال Cilent وبدأ معي:

أولا قم بتعريف المتغيرين العامين التاليين على الشكل التالي:
رموز PHP:
كود :
Socket mysoc [/color][color=#007700]= new [/color][color=#0000BB]Socket[/color][color=#007700]([/color][color=#0000BB]AddressFamily[/color][color=#007700].[/color][color=#0000BB]InterNetwork[/color][color=#007700], [/color][color=#0000BB]SocketType[/color][color=#007700].[/color][color=#0000BB]Stream[/color][color=#007700], [/color][color=#0000BB]ProtocolType[/color][color=#007700].[/color][color=#0000BB]IP[/color][COLOR=#007700]);
        [/COLOR][color=#0000BB]IPEndPoint PCLocation [/color][color=#007700]= new [/color][color=#0000BB]IPEndPoint[/color][color=#007700]([/color][color=#0000BB]IPAddress[/color][color=#007700].[/color][color=#0000BB]Parse[/color][color=#007700]([/color][color=#DD0000]"127.0.0.1"[/color][color=#007700]), [/color][color=#0000BB]1480[/color][COLOR=#007700]);



(( تنبيه للمنتقلين من المستوى المبتدئ متغير عام يعني أن يضع المتغير داخل Class وليس داخل دوال ما مثلا كما فعلنا الان فيكون الكود كاملا:

رموز PHP:
كود :
[COLOR=#0000BB]namespace Cilent
[/COLOR][COLOR=#007700]{
    public [/COLOR][color=#0000BB]partial [/color][color=#007700]class [/color][color=#0000BB]Form1 [/color][color=#007700]: [/color][COLOR=#0000BB]Form
    [/COLOR][COLOR=#007700]{
        [/COLOR][color=#0000BB]Socket mysoc [/color][color=#007700]= new [/color][color=#0000BB]Socket[/color][color=#007700]([/color][color=#0000BB]AddressFamily[/color][color=#007700].[/color][color=#0000BB]InterNetwork[/color][color=#007700], [/color][color=#0000BB]SocketType[/color][color=#007700].[/color][color=#0000BB]Stream[/color][color=#007700], [/color][color=#0000BB]ProtocolType[/color][color=#007700].[/color][color=#0000BB]IP[/color][COLOR=#007700]);
        [/COLOR][color=#0000BB]IPEndPoint PCLocation [/color][color=#007700]= new [/color][color=#0000BB]IPEndPoint[/color][color=#007700]([/color][color=#0000BB]IPAddress[/color][color=#007700].[/color][color=#0000BB]Parse[/color][color=#007700]([/color][color=#DD0000]"127.0.0.1"[/color][color=#007700]), [/color][color=#0000BB]1480[/color][COLOR=#007700]);
        public [/COLOR][color=#0000BB]Form1[/color][COLOR=#007700]()
        {
            [/COLOR][color=#0000BB]InitializeComponent[/color][COLOR=#007700]();
        }
    }
}


[/COLOR]
قهكذا يكون المتغير عام ))

أولا سوف نشرح المتغير الأول mysoc وهو ال Socket المستخدمة لإقامة الإتصال بين البرنامجين وأما عن المعطيات فلا تقلق فشرحها سوف تجده ولكن الان يهمني أن تعلم أن اخر معطية هي أننا نود إستخدام ال IP Address لكي يجد البرنامجين بعضهما...

ثانيا: PCLocation وهو متغير يتم من خلاله تحديد ال IPAddress وال Port للكومبيوتر لإستخدامها في ما بعد وأما عن الدالة Parse فقد تم شرحها في الدروس السابقة...

الان ضع ثلاثة Button وسم الأول Connect والثاني Disconnect والثالث Send Message

الان أدخل إلى الحدث Click الخاص بال Button1 واكتب...

رموز PHP:
كود :
[color=#007700]if ([/color][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connected [/color][color=#007700]== [/color][color=#0000BB]false[/color][COLOR=#007700])
            {
                try
                {
                    [/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connect[/color][color=#007700]([/color][color=#0000BB]PCLocation[/color][COLOR=#007700]);
                }
                catch ([/COLOR][color=#0000BB]Exception x[/color][COLOR=#007700])
                {
                    [/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#0000BB]x[/color][color=#007700].[/color][color=#0000BB]Message[/color][COLOR=#007700]);
                }
            }
            else if ([/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connected [/color][color=#007700]== [/color][color=#0000BB]true[/color][COLOR=#007700])
            {
                [/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#DD0000]"you are already connected to a server in:" [/color][color=#007700]+ [/color][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]LocalEndPoint[/color][COLOR=#007700]);
            }


[/COLOR]
وهنا قد إستخدمنا الأمر Connect كما هو واضح أعلاه حيث أعطيناه مكان الكومبيوتر الاخر...

** أظن أن هذا الكود واضح تماما **

والان إذهب إلى الحدث Click لل Button2 واكتب...
رموز PHP:
كود :
[color=#007700]if ([/color][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connected [/color][color=#007700]== [/color][color=#0000BB]true[/color][COLOR=#007700])
            {
                try
                {
                    [/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Disconnect[/color][color=#007700]([/color][color=#0000BB]false[/color][COLOR=#007700]);
                }
                catch ([/COLOR][color=#0000BB]Exception x[/color][COLOR=#007700])
                {
                    [/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#0000BB]x[/color][color=#007700].[/color][color=#0000BB]Message[/color][COLOR=#007700]);
                }
            }
            else if ([/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connected [/color][color=#007700]== [/color][color=#0000BB]false[/color][COLOR=#007700])
            {
                [/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#DD0000]"your are not connecting to any server.."[/color][COLOR=#007700]);
            }


[/COLOR]
والان إذهب إلى الحدث Click الخاص بال Button3 واكتب...

رموز PHP:
كود :
[color=#007700]if ([/color][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connected [/color][color=#007700]== [/color][color=#0000BB]true[/color][COLOR=#007700])
            {
                try
                {
                    [/COLOR][color=#0000BB]byte[/color][color=#007700][] [/color][color=#0000BB]mymes [/color][color=#007700]= new [/color][color=#0000BB]byte[/color][color=#007700][[/color][color=#0000BB]5[/color][COLOR=#007700]];
                    [/COLOR][color=#0000BB]mymes[/color][color=#007700][[/color][color=#0000BB]0[/color][color=#007700]] = [/color][color=#0000BB]1[/color][COLOR=#007700];
                    [/COLOR][color=#0000BB]mymes[/color][color=#007700][[/color][color=#0000BB]1[/color][color=#007700]] = [/color][color=#0000BB]2[/color][COLOR=#007700];
                    [/COLOR][color=#0000BB]mymes[/color][color=#007700][[/color][color=#0000BB]2[/color][color=#007700]] = [/color][color=#0000BB]3[/color][COLOR=#007700];
                    [/COLOR][color=#0000BB]mymes[/color][color=#007700][[/color][color=#0000BB]3[/color][color=#007700]] = [/color][color=#0000BB]4[/color][COLOR=#007700];
                    [/COLOR][color=#0000BB]mymes[/color][color=#007700][[/color][color=#0000BB]4[/color][color=#007700]] = [/color][color=#0000BB]5[/color][COLOR=#007700];
                    [/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Send[/color][color=#007700]([/color][color=#0000BB]mymes[/color][COLOR=#007700]);
                }
                catch ([/COLOR][color=#0000BB]Exception x[/color][COLOR=#007700])
                {
                    [/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#0000BB]x[/color][color=#007700].[/color][color=#0000BB]Message[/color][COLOR=#007700]);
                }
            }
            else if ([/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Connected [/color][color=#007700]== [/color][color=#0000BB]false[/color][COLOR=#007700])
            {
                [/COLOR][color=#0000BB]MessageBox[/color][color=#007700].[/color][color=#0000BB]Show[/color][color=#007700]([/color][color=#DD0000]"Connect to server first!"[/color][COLOR=#007700]);
            }


[/COLOR]
وهكذا نكون قد أتتممنا ال Cilent ...

__________________________________________________ ______________________

والان حان دور ال Server ...

كون السيرفر Console Application فإنه في حال فقدان جميع ال ForeTherads سوف يغلق البرنامج لذلك سوف نضطر إلى عمل Thread لا منتهية لحل هذه الأزمة...
(( لا يقلق الصاعدين من المبتدئ لأن هذا الموضوع لم أتطرق عليه بالدورة بعد ولكن وقته بات قريبا ))

قم بعمل ال Thread بالشكل التالي:

ولا قم بإضافة هذا الأمر:

رموز PHP:
كود :
[color=#007700]static [/color][color=#0000BB]void infinity[/color][COLOR=#007700]()
        {
            [/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700].[/color][color=#0000BB]CurrentThread[/color][color=#007700].[/color][color=#0000BB]Suspend[/color][COLOR=#007700]();
        }


[/COLOR]
ثم ضف Thread وشغلها كالتالي:
رموز PHP:
كود :
System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread life [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700]([/color][color=#0000BB]infinity[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]life[/color][color=#007700].[/color][color=#0000BB]Start[/color][COLOR=#007700]();



فيصبح الكود كامل:

رموز PHP:
كود :
[COLOR=#0000BB]namespace Server
[/COLOR][COLOR=#007700]{
    class [/COLOR][COLOR=#0000BB]Program
    [/COLOR][COLOR=#007700]{
        static [/COLOR][color=#0000BB]void Main[/color][color=#007700]([/color][color=#0000BB]string[/color][color=#007700][] [/color][color=#0000BB]args[/color][COLOR=#007700])
        {
            [/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread life [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700]([/color][color=#0000BB]infinity[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]life[/color][color=#007700].[/color][color=#0000BB]Start[/color][COLOR=#007700]();
        }
        static [/COLOR][color=#0000BB]void infinity[/color][COLOR=#007700]()
        {
            [/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700].[/color][color=#0000BB]CurrentThread[/color][color=#007700].[/color][color=#0000BB]Suspend[/color][COLOR=#007700]();
        }
    }
}


[/COLOR]
والان لنبدأ بالسيرفر:

أولا قم بتعريف المتغيرين العامين نفسهم...
رموز PHP:
كود :
[color=#007700]static [/color][color=#0000BB]Socket mysoc [/color][color=#007700]= new [/color][color=#0000BB]Socket[/color][color=#007700]([/color][color=#0000BB]AddressFamily[/color][color=#007700].[/color][color=#0000BB]InterNetwork[/color][color=#007700], [/color][color=#0000BB]SocketType[/color][color=#007700].[/color][color=#0000BB]Stream[/color][color=#007700], [/color][color=#0000BB]ProtocolType[/color][color=#007700].[/color][color=#0000BB]IP[/color][COLOR=#007700]);
        static [/COLOR][color=#0000BB]IPEndPoint PCLocation [/color][color=#007700]= new [/color][color=#0000BB]IPEndPoint[/color][color=#007700]([/color][color=#0000BB]IPAddress[/color][color=#007700].[/color][color=#0000BB]Parse[/color][color=#007700]([/color][color=#DD0000]"127.0.0.1"[/color][color=#007700]), [/color][color=#0000BB]1480[/color][COLOR=#007700]);


[/COLOR]
ثم بعد بعض الإضافات يكون الكود كاملا...

رموز PHP:
كود :
[color=#0000BB]using System[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Collections[/color][color=#007700].[/color][color=#0000BB]Generic[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Linq[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Text[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Net[/color][color=#007700].[/color][color=#0000BB]Sockets[/color][COLOR=#007700];
[/COLOR][color=#0000BB]using System[/color][color=#007700].[/color][color=#0000BB]Net[/color][COLOR=#007700];
[/COLOR][COLOR=#0000BB]namespace Server
[/COLOR][COLOR=#007700]{
    class [/COLOR][COLOR=#0000BB]Program
    [/COLOR][COLOR=#007700]{
       static [/COLOR][color=#0000BB]Socket mysoc [/color][color=#007700]= new [/color][color=#0000BB]Socket[/color][color=#007700]([/color][color=#0000BB]AddressFamily[/color][color=#007700].[/color][color=#0000BB]InterNetwork[/color][color=#007700], [/color][color=#0000BB]SocketType[/color][color=#007700].[/color][color=#0000BB]Stream[/color][color=#007700], [/color][color=#0000BB]ProtocolType[/color][color=#007700].[/color][color=#0000BB]IP[/color][COLOR=#007700]);
       static [/COLOR][color=#0000BB]IPEndPoint PCLocation [/color][color=#007700]= new [/color][color=#0000BB]IPEndPoint[/color][color=#007700]([/color][color=#0000BB]IPAddress[/color][color=#007700].[/color][color=#0000BB]Any[/color][color=#007700], [/color][color=#0000BB]1480[/color][COLOR=#007700]);
        static [/COLOR][color=#0000BB]void Main[/color][color=#007700]([/color][color=#0000BB]string[/color][color=#007700][] [/color][color=#0000BB]args[/color][COLOR=#007700])
        {
            [/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread life [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700]([/color][color=#0000BB]infinity[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread listen [/color][color=#007700]= new [/color][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700]([/color][color=#0000BB]filerec[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]listen[/color][color=#007700].[/color][color=#0000BB]Start[/color][COLOR=#007700]();
            [/COLOR][color=#0000BB]life[/color][color=#007700].[/color][color=#0000BB]Start[/color][COLOR=#007700]();
        }
        static [/COLOR][color=#0000BB]void infinity[/color][COLOR=#007700]()
        {
            [/COLOR][color=#0000BB]System[/color][color=#007700].[/color][color=#0000BB]Threading[/color][color=#007700].[/color][color=#0000BB]Thread[/color][color=#007700].[/color][color=#0000BB]CurrentThread[/color][color=#007700].[/color][color=#0000BB]Suspend[/color][COLOR=#007700]();
        }
        static [/COLOR][color=#0000BB]void filerec[/color][COLOR=#007700]()
        {
            [/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Bind[/color][color=#007700]([/color][color=#0000BB]PCLocation[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Listen[/color][color=#007700]([/color][color=#0000BB]5[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#DD0000]"waiting for cilent..."[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]Socket cilent [/color][color=#007700]= [/color][color=#0000BB]mysoc[/color][color=#007700].[/color][color=#0000BB]Accept[/color][COLOR=#007700]();
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#DD0000]"connection accept!  receving data..."[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]byte[/color][color=#007700][] [/color][color=#0000BB]msg [/color][color=#007700]= new [/color][color=#0000BB]byte[/color][color=#007700][[/color][color=#0000BB]5[/color][COLOR=#007700]];
            [/COLOR][color=#0000BB]cilent[/color][color=#007700].[/color][color=#0000BB]Receive[/color][color=#007700]([/color][color=#0000BB]msg[/color][COLOR=#007700]);
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]msg[/color][color=#007700][[/color][color=#0000BB]0[/color][color=#007700]].[/color][color=#0000BB]ToString[/color][COLOR=#007700]());
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]msg[/color][color=#007700][[/color][color=#0000BB]1[/color][color=#007700]].[/color][color=#0000BB]ToString[/color][COLOR=#007700]());
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]msg[/color][color=#007700][[/color][color=#0000BB]2[/color][color=#007700]].[/color][color=#0000BB]ToString[/color][COLOR=#007700]());
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]msg[/color][color=#007700][[/color][color=#0000BB]3[/color][color=#007700]].[/color][color=#0000BB]ToString[/color][COLOR=#007700]());
            [/COLOR][color=#0000BB]Console[/color][color=#007700].[/color][color=#0000BB]WriteLine[/color][color=#007700]([/color][color=#0000BB]msg[/color][color=#007700][[/color][color=#0000BB]4[/color][color=#007700]].[/color][color=#0000BB]ToString[/color][COLOR=#007700]());
        }
    }
}


[/COLOR]
والان لم يبقى عليك إلا تجربة البرنامج كالتالي...

إفتح الServer ثم إفتح ال Cilent وإضغط على زر Connect سوف تلاحظ إتصل ال Cilent بال Server
الان إضغط على زر Send Message فقوم ال Cilent بإرسال رسالة إلى ال Server ويقوم ال Server بتلقيها وطباعتها على ال Console


مبروك!! أول برنامج لك في عالم ال Sockets أصبح جاهزا...

يتبع في الدرس القادم إن شاء الله.
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم