المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس 12: شرح تقنية WCF والتخصص بال Sockets مع مثال دورة C#


khaledbelal
02-12-2010, 02:51 AM
السلام عليكم ورحمة الله وبركاته...
اليوم وفي أول درس من المستوى المتوسط أولا سوف نقوم بشرح ال 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 PC******** = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1480);
بدلا من النجوم ضع كلمة L ocation مع حذف المسافة بين حرفي الـ L و O
(( تنبيه للمنتقلين من المستوى المبتدئ متغير عام يعني أن يضع المتغير داخل Class وليس داخل دوال ما مثلا كما فعلنا الان فيكون الكود كاملا:

namespace Cilent
{
public partial class Form1 : Form
{
Socket mysoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint PC******** = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1480);
public Form1()
{
InitializeComponent();
}
}
}

قهكذا يكون المتغير عام ))

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

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

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

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

if (mysoc.Connected == false)
{
try
{
mysoc.Connect(PC********);
}
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 PC******** = 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 PC******** = 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(PC********);
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 أصبح جاهزا...

يتبع في الدرس القادم إن شاء الله...

منقووووووووووول من منتدى فيجوال بيسك للعرب

فهد المصري
02-14-2010, 02:47 AM
اسلوب بسيط وجيد
بارك الله فيك

ماريا إسلام
11-02-2010, 09:40 PM
وعليكم السلام ورحمة الله

جزاكم الله خيرراااا
وفقكم الله لماا يحب ويرضاا
،،،

//