دورة السي شارب
الدرس 11- شرح تقنية WCF والتخصص
بال Sockets مع مثال
السلام عليكم ورحمة الله وبركاته...
اليوم وفي أول درس من المستوى المتوسط أولا
سوف نقوم بشرح ال 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 وبدأ معي:
أولا قم بتعريف المتغيرين العامين التاليين
على الشكل التالي:
Socket mysoc=new Socket(AddressFamily.InterNetwork,SocketType.Stream.protocoltype.IP);
IPEndPoint
PCLocation=new IPEndPoint (IPAddress.Parse("127.0.0.1"),1480);
تنبيه للمنتقلين من المستوى المبتدئ متغير عام يعني أن يضع المتغير داخل
Class وليس داخل
دوال ما مثلا كما فعلنا الان فيكون الكود كاملا:
namespace Cilent
{
public partial class Form1 : Form
{
Socket mysoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.IP);
IPEndPoint PCLocation = new IPEndPoint(IPAddress.Parse("127.0.0.1"),
1480);
public Form1()
{
InitializeComponent();
}
}
}
قهكذا يكون المتغير عام ))
أولا سوف نشرح المتغير الأول mysoc وهو ال
Socket المستخدمة
لإقامة الإتصال بين البرنامجين وأما عن المعطيات فلا تقلق فشرحها سوف تجده ولكن الان
يهمني أن تعلم أن اخر معطية هي أننا نود إستخدام ال IP
Address لكي يجد البرنامجين بعضهما...
ثانيا: PCLocation
وهو متغير يتم من خلاله تحديد ال IPAddress
وال Port للكومبيوتر لإستخدامها في ما بعد وأما عن الدالة Parse فقد تم
شرحها في الدروس السابقة...
الان ضع ثلاثة Button
وسم الأول Connect
والثاني Disconnect
والثالث Send Message
الان أدخل إلى الحدث Click الخاص بال
Button1 واكتب...
if (mysoc.Connected == false)
{
try
{
mysoc.Connect(PCLocation);
}
catch (Exception x)
{
MessageBox.Show(x.Message);
}
}
else if (mysoc.Connected == true)
{
MessageBox.Show("you are
already connected to a server in:" + mysoc.LocalEndPoint);
}
وهنا قد إستخدمنا الأمر Connect
كما هو واضح أعلاه حيث أعطيناه مكان الكومبيوتر الاخر...
** أظن أن هذا الكود واضح تماما **
والان إذهب إلى الحدث Click
لل Button2 واكتب...
if (mysoc.Connected == true)
{
try
{
mysoc.Disconnect(false);
}
catch (Exception x)
{
MessageBox.Show(x.Message);
}
}
else if (mysoc.Connected == false)
{
MessageBox.Show("your are
not connecting to any server..");
}
والان إذهب إلى الحدث Click
الخاص بال Button3
واكتب...
if (mysoc.Connected == true)
{
try
{
byte[] mymes = new byte[5];
mymes[0] = 1;
mymes[1] = 2;
mymes[2] = 3;
mymes[3] = 4;
mymes[4] = 5;
mysoc.Send(mymes);
}
catch (Exception x)
{
MessageBox.Show(x.Message);
}
}
else if (mysoc.Connected == false)
{
MessageBox.Show("Connect
to server first!");
}
وهكذا نكون قد أتتممنا ال Cilent ...
والان حان دور ال Server ...
كون السيرفر Console
Application فإنه في
حال فقدان جميع ال ForeTherads سوف يغلق البرنامج لذلك سوف نضطر إلى عمل Thread
لا منتهية لحل هذه الأزمة...
(( لا يقلق الصاعدين من المبتدئ لأن هذا
الموضوع لم أتطرق عليه بالدورة بعد ولكن وقته بات قريبا ))
قم بعمل ال Thread
بالشكل التالي:
ولا قم بإضافة هذا الأمر:
static void infinity()
{
System.Threading.Thread.CurrentThread.Suspend();
}
ثم ضف Thread
وشغلها كالتالي:
System.Threading.Thread life = new
System.Threading.Thread(infinity);
life.Start();
فيصبح الكود كامل:
namespace Server
{
class Program
{
static void Main(string[] args)
{
System.Threading.Thread life = new System.Threading.Thread(infinity);
life.Start();
}
static void infinity()
{
System.Threading.Thread.CurrentThread.Suspend();
}
}
}
والان لنبدأ بالسيرفر:
أولا قم بتعريف المتغيرين العامين نفسهم...
static Socket mysoc = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.IP);
static
IPEndPoint PCLocation = new IPEndPoint(IPAddress.Parse("127.0.0.1"),
1480);
ثم بعد بعض الإضافات يكون الكود كاملا...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Server
{
class Program
{
static Socket mysoc = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.IP);
static
IPEndPoint PCLocation = new IPEndPoint(IPAddress.Any, 1480);
static
void Main(string[] args)
{
System.Threading.Thread life = new System.Threading.Thread(infinity);
System.Threading.Thread listen = new System.Threading.Thread(filerec);
listen.Start();
life.Start();
}
static void infinity()
{
System.Threading.Thread.CurrentThread.Suspend();
}
static void filerec()
{
mysoc.Bind(PCLocation);
mysoc.Listen(5);
Console.WriteLine("waiting for cilent...");
Socket cilent = mysoc.Accept();
Console.WriteLine("connection accept! receving data...");
byte[] msg = new byte[5];
cilent.Receive(msg);
Console.WriteLine(msg[0].ToString());
Console.WriteLine(msg[1].ToString());
Console.WriteLine(msg[2].ToString());
Console.WriteLine(msg[3].ToString());
Console.WriteLine(msg[4].ToString());
}
}
}
الان لم يبقى عليك إلا تجربة البرنامج كالتالي...
إفتح الServer
ثم إفتح ال Cilent
وإضغط على زر Connect
سوف تلاحظ إتصل ال Cilent
بال Server
الان إضغط على زر Send Message فقوم ال
Cilent بإرسال
رسالة إلى ال Server ويقوم ال Server بتلقيها وطباعتها على ال Console
مبروك!! أول برنامج لك في عالم ال Sockets أصبح جاهزا...
مع تحياتي: abdalkader Al-badani
يتبع في الدرس القادم إن شاء الله.
ليست هناك تعليقات:
إرسال تعليق