16-10-13, 12:18 AM
(آخر تعديل لهذه المشاركة : 22-10-13, 09:19 PM {2} بواسطة الشاكي لله.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
والصلاة والسلام على اشرف الخلق محمد وعلى اله الطيبين الطاهرين
--
اهلا وسهلا بكم اخواني الاعزاء في الدرس الثاني من [سلسلة التحكم]
اليوم سنقوم بالتحكم بجهاز اخر على الشبكة المحلية بواسطة فئات مجال الاسماء Remoting
سنقوم بكتابة برنامجين ، واحد يسمى Client (العميل) ، والاخر يسمى (Server) الخادم
البرنامج العميل هذا يكون عندك ، وبرنامج الخادم يكون عند الجهاز الذي تريد التحكم به (الهدف)
المقصود بالتحكم هو تنفيذ الكود على الجهاز الهدف ، مثلا انت تكتب كود لتغيير خلفية سطح المكتب
هذا الكود تكتبه في دالة في البرنامج الخادم ، يقوم برنامج العميل بتطبيق الRemoting ويستدعي تلك الدالة
فتقوم الدالة بتغيير سطح المكتب الجهاز الهدف .
صفر :- اجزاء المقالة
اولا :- التعريف ب Remoting
ثانيا :- كتابة Remotable Object - (جهة الخادم)
ثالثا :- تسجيل قناة جديدة - (جهة الخادم)
رابعا :- تسجيل قناة ، للإتصال بقناة الخادم - (جهة العميل)
خامسا :- استدعاء دوال واجراءات الRemotable Object - (جهة العميل)
سادسا :- نتيجة الدرس (عرض فيديو)
سابعا :- المراجع & الخاتمة
اولا :- التعريف ب Remoting
هي مجموعة دوال ضمن Remoting Namespace تسمح للتطبيقات بالتواصل بين بعضهم البعض
من خلال قناة محددة تعمل على البروتوكول Http او Tcp.
كيف تعمل Remoting ؟؟
شاهد الصورة :-
كل مااريدك ان تركز عليه هو Server Object
هذا الServer Object عبارة عن فئة (Class) تحتوي على دوال واكواد
هذه الدوال والاكواد يمكنك استدعائها من جانب الClient ليتم تنفيذها على الServer
مثلا لو كتبت في Server Object دالة بإسم ShutdownCoumputer
ووضعت داخلها كود يقوم بإطفاء الكومبيوتر ، نستطيع ان نستدعيها متى نريد من جانب الClient
ممكن مثلا تكتب دالة اخرى لتغيير شكل الماوس ، او دالة لإلغاء عمل الكيبورد ، ثم تستدعي اي دالة تريدها من الClient
ليتم تنفيذها على الجهاز المستهدف (Server) .
لذلك علينا ان نقوم بكتابة Server Object او مايسميه البعض Remote Object
وكما قلنا هذا Server Object عبارة عن كلاس فيها دوال او خصائص او اي شي
تقدر تستدعيها لما تطبق مبدا الRemoting ، في الجزء الثاني سنقوم بكتابة الServer Object .
اولا :-كتابة Remotable Object - (جهة الخادم)
في الجزء السابق قمنا بتوضيح معني ال Remote Object وقلنا أنه Class
يحتوي على اعضاء (دوال - خصائص - مفوضات ...) يمكننا استدعائها من جهة المتحكم يسمى بClient
إذن عرفنا بأن الRemote Object هو Class ، حسنا لنقم بإنشاء الRemote Object .
--
خطوات بناء الRemote Object :-
1- قم بإنشاء مشروع جديد من نوع Class Library وسمه RemoteObject
2- قم بتغيير اسم Class1 الى Control
3- قم بتوريث الفئة من MarshalByRefObject
خطوات بناء الRemote Object (بالصور) :-
1-
2-
3-
--
السبب من توريث الفئة منMarshalByRefObject سيتم توضيحه لاحقا .
الان يمكننا كتابة دوال للتحكم بالحاسب مثلا ، وسنقوم باستدعائها من العميل لاحقا
سنتقوم بإضافة 3 دوال :-
ShutdownComputer : لإطفاء الحاسب بأمر من العميل
ViewMessage : لعرض رسالة مرسلة من العميل
Beeb : تشغيل صوت النظام (بييب) بأمر من العميل
بعد كتابة الدوال ستكون الRemote Object كالاتي :-
الان انتهينا من الRemote Object .
ثالثا :- تسجيل قناة جديدة - (جهة الخادم)
الان سنقوم بتعريف (تسجيل) قناة جديدة ليتم التواصل بواسطتها
سنبدأ الان ببرمجة برنامج الخادم (Server)
ممكن نسوي مشروع Windows Forms ونسجل قناة
ولكن لعدم حاجتنا له سنقوم بعمل Console Application .
يفضل عمل برنامج الخادم في نفس الSolution عشان سهولة استدعاء وتعديل الكلاس Remote Object
لكن لامشكلة إن كان في Solution اخر ، ولكننا في هذا الدرس سنقوم بعمل جميع مشاريعنا الثلاثة في Solution واحد
إحنا سوينا مشروع واحد حتى الان من أصل 3 مشاريع ، والان سنقوم بعمل مشروع من نوع
Console Application بإسم Server App :
سنقوم الان بكتابة بعض الاكواد لتقوم بتسجيل قناة جديدة
لكن اولا علينا بإضافة مكتبة System.Runtime.Remoting من خلال Add Refrences
بعدها نتوقف قليلا ونفكر ... ماهو البروتوكول الذي سنستعمله للتحكم ؟؟
ذكرنا في بداية المقال ان لدينا بروتوكولين Http و TCP لنستطيع التحكم
--
الفرق بين TCP و HTTP :-
-TCP : اسرع من الاخر بسبب انه ينقل البيانات بصيغة الBinary
-TCP : افضل من ناحية الاداء
-HTTP : أبطأ من الاخر بسبب انه يحول البيانات الى صيغة XML ثم يرسلها
-HTTP : يعمل على جميع المنصات التي تدعم هذا البروتوكول ، بعني حتى المتصفح يمكنه الاستفادة من Remoting
--
في هذا المقال سنقوم بالتعامل مع البروتوكول Http .
الان بعد ان حددنا البروتوكول المستخدم في الRemoting علينا بإستيراد المكتبات الضرورية :-
لو فضلنا استعمال البروتوكول Tcp ماعلينا سوا اضافة
الان سنقوم باستيراد الRemote Object الي عملناها :
تمام ، الان سنقوم بكتابة كود تسجيل القناة وهو كالاتي :-
وإما لو اخترت البروتوكول TCP عليك تغيير السطر الاول فقط
السطر الاول والثاني لايحتاجان لتوضيح ، ولكن السطر الثالث ..
--
شرح السطر الثالث :-
في البارمتار الاول قمنا بوضع الRemote object
في البارمتار الثاني اخترنا اسم فريد للخدمة . واقصد بالخدمة هي نفسها Remoting ، ستعلم فائدة هذا البارمتار في وقت لاحق
في البارمتار الثالث قمنا بتحديد Remote Instance Object Mode وهو إما SingleCall او Singelton
الفرق بين SingleCall و Singleton :-
في حالة SingleCall لنفرض ان هناك عميلين او اكثر سيتصلان بالخادم
حيث ان الRemote object الخاصة بالخادم والتي سيتعامل معها العميل1 ستكون خاصة به
اي انه اي تعديل سيحصل في Remote object من طرف العميل1 لن يؤثر على
ال Remote object التي سيتعامل معها العميل2 .
اما في حالة الSingleton فإذا قام اي من العملاء بتعديل في Remote object سيؤثر هذا
على جميع العملاء الاخرون حيث انه في Singleton سيشترك الجميع في Instance واحد
على عكس ال SingleCall حيث لكل عميل Instance خاص به.
مثال بسيط . لو افترضنا اننا قمنا بوضع متغير مثلا (x) ويساوي 0 داخل الRemote object الذي قمنا بعمله في الجزء السابق
ثم قمنا بتعيين Singleton في البارمتار ، وقام 3 عملاء بالاتصال بالخادم
وقام احد العملاء بتغيير قيمة المتغير x الى 10
ومن عميل اخر قمنا بالاستعلام عن قيمة x .. سيكون الجواب هو 10 !!
لأن في حالة Singleton اي عميل يغير في الRemote object سيؤثر على الجميع
ولكن في SingleCall لن يحصل هذا لأن لكل عميل Instance خاص به .
--
المهم ، كود الServer App كاملا :-
الان اصبح السيرفر جاهزا لإستقبال طلبات العملاء وتنفيذ الاوامر ، فالان سننتقل لجهة العميل .
رابعا :- تسجيل قناة ، للإتصال بقناة الخادم - (جهة العميل)
بدون اي مقدمات ، قم بإنشاء مشروع جديد في ضمن نفس الSolution
من نوع Windows Forms وبإسم Client App :
الان اصبح الSolution بهذا الشكل :
نتجه إلى الForm1 ونقوم بتصمميمه بهذا الشكل :
الان نعرف متغير عام (لاتنسى اضافة الRemote object الى سويناها) :
-
وإذا سألتني وقلت ليش نستورد الRemote object لأنها المفروض تكون class فيها دوال يتم تنفيذها على الServer
واحنا نشتغل على جانب الClient .
اقولك كلامك صحيح . بس احنا منحتاج الclass فقط لعملية الcasting (اي تحويل قيمة من نوع object الى class)
الاسطر الي تحت بتوضح كلامي
-
الان ندخل ونبرمج الزر Start الذي سيقوم بتسجيل قناة بنفس الخطوات المتبعة في الجزء السابق (يعني قم بإضافة المكتبات اللازمة)
كما تلاحظ قمنا بكتابة url وهو يمثل ip السيرفر مع البورت مع الاسم الفريد الذي حددناه في الجزء السابق
يكون الurl بالشكل التالي :-
ip السيرفر تستطيع الحصول عليه من موجة الاوامر عبر الامر ipconfig
نرجع لكودنا ، نلاحظ اننا كتبنا
هذا الكود اعلاه هو لجلب ال Remote object تبع السيرفر ووضعه في Control_
لهذا وضعنا url في البارمتار الثاني لنقول له
"اجلب الRemote object الخاص بالUrl والشبيه بRemoteObject.Control ثم ضعه في Control_"
ومن هنا تتضح فائدة التوريث من MarshalByRefObject
لان كما نعرف ان الفرق بين المرجع والقيمة
هو ان نقل البيانات من مكان الى اخر بالقيمة يعني إنشاء نسخة منها ونقلها
ولكن نقل البيانات بالمرجع هو نقل عنوان البيانات في الذاكرة بدون اخذ نسخة منها
فلو لم نقم بالتوريث من MarshalByRefObject لقام السيرفر
يإنشاء نسخة من Remote object خاصته وإرسالها اللعميل
فالذي سيحصل هو ان اكواد الRemote object سيتم تنفيذها على جهة العميل (نحن)
ونحن لانريد التحكم في انفسنا بل في الجهاز الخادم (سيرفر) ، لذلك قمنا بالتوريث .
خامسا :- استدعاء دوال واجراءات الRemotable Object - (جهة العميل)
الان بكل بساطة بعد ان استطعنا جلب الRemote object (الخاص بالServer) كما فعلنا في الخطوات السابقة
وقمنا بوضعها في Control_ الان يمكننا تنفيذ اي دالة على الجهاز الاخر بكل سهوولة
قم ببرمجة الزر الاول :-
والثاني :-
واخيرا الثالث :-
هكذا قمنا باستدعاء دوال Remote object (التابع للServer) من خلال الClient
الان اضغط على الButton1 وروح للServer وشوف جهازه بند لو لا ههههه
--
خطوات التحكم :-
الان بعد اكمالنا لجميع الخطوات ، قم ببناء الSolution من خلال
Bulid > Bulid Solution
بعدها اذهب الى مجلد الSolution
وادخل على Server App
قم بنقل برنامج Server App وRemoteobject.dll من مجلد Release
الى اي جهاز معك بالشبكة
شغل البرنامج ، واذا ظهرت لك نافذة التحذير تبع الFireware :
اضغط Allow Access
ثم قم بأخذ ip الجهاز (يمكننا الحصول عليه من خلال الامر Ipconfig ، كما وضحت سابقا)
--
قم بتشغيل برنامج الClient
وقم بإدخال Ip ذلك الجهاز .
وقم بالضغط على Shutdown ليقوم الClient باستدعاء
الدالة Shutdown لتقوم بإطفاء الServer ههههه
والبقية كذلك ايضا
سادسا :- نتيجة الدرس (عرض فيديو)
فيديو من تصويري يعرض جهاز خادم يتم التحكم به من جهاز اخر (العميل)
مشاهدة ممتعة
او من على اليوتيوب مباشرة :
سابعا :- المراجع & الخاتمة
المراجع المعتمد عليها في هذه المقالة :-
NET-Remoting-with-an-easy-example
Remoting in C# and .NET - The Journal of Object Technology
وأخيرا إن اردت إحتراف هذه التقنية الرائعة ، هذا كتاب شامل من 331 صفحة يتكلم عن Remoting بالتفصيل :
Advanced .NET Remoting
--
أتمنى اني وققت في سرد هذه المعلومات الكثيرة عن هذه التقنية
واتمنى من إداريي هذا المنتدى اضافة المحرر المتقدم (html)
لأنني بسبب المحرر الحالي قمت بإعادة تنسيق المقالة من جديد
وعيدكم مبارك وكل سنة وانتو طيبين ، نلقاكم في دروس اكثر اثارة في الاسبوع القادم .
إنتهى
السلام عليكم ورحمة الله وبركاته
والصلاة والسلام على اشرف الخلق محمد وعلى اله الطيبين الطاهرين
--
اهلا وسهلا بكم اخواني الاعزاء في الدرس الثاني من [سلسلة التحكم]
اليوم سنقوم بالتحكم بجهاز اخر على الشبكة المحلية بواسطة فئات مجال الاسماء Remoting
سنقوم بكتابة برنامجين ، واحد يسمى Client (العميل) ، والاخر يسمى (Server) الخادم
البرنامج العميل هذا يكون عندك ، وبرنامج الخادم يكون عند الجهاز الذي تريد التحكم به (الهدف)
المقصود بالتحكم هو تنفيذ الكود على الجهاز الهدف ، مثلا انت تكتب كود لتغيير خلفية سطح المكتب
هذا الكود تكتبه في دالة في البرنامج الخادم ، يقوم برنامج العميل بتطبيق الRemoting ويستدعي تلك الدالة
فتقوم الدالة بتغيير سطح المكتب الجهاز الهدف .
صفر :- اجزاء المقالة
اولا :- التعريف ب Remoting
ثانيا :- كتابة Remotable Object - (جهة الخادم)
ثالثا :- تسجيل قناة جديدة - (جهة الخادم)
رابعا :- تسجيل قناة ، للإتصال بقناة الخادم - (جهة العميل)
خامسا :- استدعاء دوال واجراءات الRemotable Object - (جهة العميل)
سادسا :- نتيجة الدرس (عرض فيديو)
سابعا :- المراجع & الخاتمة
اولا :- التعريف ب Remoting
هي مجموعة دوال ضمن Remoting Namespace تسمح للتطبيقات بالتواصل بين بعضهم البعض
من خلال قناة محددة تعمل على البروتوكول Http او Tcp.
كيف تعمل Remoting ؟؟
شاهد الصورة :-
كل مااريدك ان تركز عليه هو Server Object
هذا الServer Object عبارة عن فئة (Class) تحتوي على دوال واكواد
هذه الدوال والاكواد يمكنك استدعائها من جانب الClient ليتم تنفيذها على الServer
مثلا لو كتبت في Server Object دالة بإسم ShutdownCoumputer
ووضعت داخلها كود يقوم بإطفاء الكومبيوتر ، نستطيع ان نستدعيها متى نريد من جانب الClient
ممكن مثلا تكتب دالة اخرى لتغيير شكل الماوس ، او دالة لإلغاء عمل الكيبورد ، ثم تستدعي اي دالة تريدها من الClient
ليتم تنفيذها على الجهاز المستهدف (Server) .
لذلك علينا ان نقوم بكتابة Server Object او مايسميه البعض Remote Object
وكما قلنا هذا Server Object عبارة عن كلاس فيها دوال او خصائص او اي شي
تقدر تستدعيها لما تطبق مبدا الRemoting ، في الجزء الثاني سنقوم بكتابة الServer Object .
اولا :-كتابة Remotable Object - (جهة الخادم)
في الجزء السابق قمنا بتوضيح معني ال Remote Object وقلنا أنه Class
يحتوي على اعضاء (دوال - خصائص - مفوضات ...) يمكننا استدعائها من جهة المتحكم يسمى بClient
إذن عرفنا بأن الRemote Object هو Class ، حسنا لنقم بإنشاء الRemote Object .
--
خطوات بناء الRemote Object :-
1- قم بإنشاء مشروع جديد من نوع Class Library وسمه RemoteObject
2- قم بتغيير اسم Class1 الى Control
3- قم بتوريث الفئة من MarshalByRefObject
خطوات بناء الRemote Object (بالصور) :-
1-
2-
3-
--
السبب من توريث الفئة منMarshalByRefObject سيتم توضيحه لاحقا .
الان يمكننا كتابة دوال للتحكم بالحاسب مثلا ، وسنقوم باستدعائها من العميل لاحقا
سنتقوم بإضافة 3 دوال :-
ShutdownComputer : لإطفاء الحاسب بأمر من العميل
ViewMessage : لعرض رسالة مرسلة من العميل
Beeb : تشغيل صوت النظام (بييب) بأمر من العميل
بعد كتابة الدوال ستكون الRemote Object كالاتي :-
PHP كود :
public class Control : MarshalByRefObject
{
public void ShutdownComputer()
{
System.Diagnostics.Process.Start("shutdown", "/s /t 0");
}
public void ViewMessage(string str)
{
System.Windows.Forms.MessageBox.Show(str); //Add Refrences > System.Windows.Forms
}
public void Beeb()
{
System.Media.SystemSounds.Beep.Play();
}
الان انتهينا من الRemote Object .
ثالثا :- تسجيل قناة جديدة - (جهة الخادم)
الان سنقوم بتعريف (تسجيل) قناة جديدة ليتم التواصل بواسطتها
سنبدأ الان ببرمجة برنامج الخادم (Server)
ممكن نسوي مشروع Windows Forms ونسجل قناة
ولكن لعدم حاجتنا له سنقوم بعمل Console Application .
يفضل عمل برنامج الخادم في نفس الSolution عشان سهولة استدعاء وتعديل الكلاس Remote Object
لكن لامشكلة إن كان في Solution اخر ، ولكننا في هذا الدرس سنقوم بعمل جميع مشاريعنا الثلاثة في Solution واحد
إحنا سوينا مشروع واحد حتى الان من أصل 3 مشاريع ، والان سنقوم بعمل مشروع من نوع
Console Application بإسم Server App :
سنقوم الان بكتابة بعض الاكواد لتقوم بتسجيل قناة جديدة
لكن اولا علينا بإضافة مكتبة System.Runtime.Remoting من خلال Add Refrences
بعدها نتوقف قليلا ونفكر ... ماهو البروتوكول الذي سنستعمله للتحكم ؟؟
ذكرنا في بداية المقال ان لدينا بروتوكولين Http و TCP لنستطيع التحكم
--
الفرق بين TCP و HTTP :-
-TCP : اسرع من الاخر بسبب انه ينقل البيانات بصيغة الBinary
-TCP : افضل من ناحية الاداء
-HTTP : أبطأ من الاخر بسبب انه يحول البيانات الى صيغة XML ثم يرسلها
-HTTP : يعمل على جميع المنصات التي تدعم هذا البروتوكول ، بعني حتى المتصفح يمكنه الاستفادة من Remoting
--
في هذا المقال سنقوم بالتعامل مع البروتوكول Http .
الان بعد ان حددنا البروتوكول المستخدم في الRemoting علينا بإستيراد المكتبات الضرورية :-
PHP كود :
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
لو فضلنا استعمال البروتوكول Tcp ماعلينا سوا اضافة
PHP كود :
System.Runtime.Remoting.Channels.Tcp
الان سنقوم باستيراد الRemote Object الي عملناها :
تمام ، الان سنقوم بكتابة كود تسجيل القناة وهو كالاتي :-
PHP كود :
HttpChannel channel = new HttpChannel(6000); //البورت الذي ستعمل القناة عليه
ChannelServices.RegisterChannel(channel); //تسجيل القناة
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.Control), "vb4arbTest", WellKnownObjectMode.SingleCall);
وإما لو اخترت البروتوكول TCP عليك تغيير السطر الاول فقط
PHP كود :
TcpChannel channel = new TcpChannel(6000);
السطر الاول والثاني لايحتاجان لتوضيح ، ولكن السطر الثالث ..
--
شرح السطر الثالث :-
في البارمتار الاول قمنا بوضع الRemote object
في البارمتار الثاني اخترنا اسم فريد للخدمة . واقصد بالخدمة هي نفسها Remoting ، ستعلم فائدة هذا البارمتار في وقت لاحق
في البارمتار الثالث قمنا بتحديد Remote Instance Object Mode وهو إما SingleCall او Singelton
الفرق بين SingleCall و Singleton :-
في حالة SingleCall لنفرض ان هناك عميلين او اكثر سيتصلان بالخادم
حيث ان الRemote object الخاصة بالخادم والتي سيتعامل معها العميل1 ستكون خاصة به
اي انه اي تعديل سيحصل في Remote object من طرف العميل1 لن يؤثر على
ال Remote object التي سيتعامل معها العميل2 .
اما في حالة الSingleton فإذا قام اي من العملاء بتعديل في Remote object سيؤثر هذا
على جميع العملاء الاخرون حيث انه في Singleton سيشترك الجميع في Instance واحد
على عكس ال SingleCall حيث لكل عميل Instance خاص به.
مثال بسيط . لو افترضنا اننا قمنا بوضع متغير مثلا (x) ويساوي 0 داخل الRemote object الذي قمنا بعمله في الجزء السابق
ثم قمنا بتعيين Singleton في البارمتار ، وقام 3 عملاء بالاتصال بالخادم
وقام احد العملاء بتغيير قيمة المتغير x الى 10
ومن عميل اخر قمنا بالاستعلام عن قيمة x .. سيكون الجواب هو 10 !!
لأن في حالة Singleton اي عميل يغير في الRemote object سيؤثر على الجميع
ولكن في SingleCall لن يحصل هذا لأن لكل عميل Instance خاص به .
--
المهم ، كود الServer App كاملا :-
PHP كود :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
namespace Server_App
{
class Program
{
static void Main(string[] args)
{
HttpChannel channel = new HttpChannel(6000); //البورت الذي ستعمل القناة عليه
ChannelServices.RegisterChannel(channel); //تسجيل القناة
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.Control), "vb4arbTest", WellKnownObjectMode.SingleCall);
Console.WriteLine("Server is starting .... press and key to exit");
Console.ReadKey();
System.Environment.Exit(0);
}
}
}
الان اصبح السيرفر جاهزا لإستقبال طلبات العملاء وتنفيذ الاوامر ، فالان سننتقل لجهة العميل .
رابعا :- تسجيل قناة ، للإتصال بقناة الخادم - (جهة العميل)
بدون اي مقدمات ، قم بإنشاء مشروع جديد في ضمن نفس الSolution
من نوع Windows Forms وبإسم Client App :
الان اصبح الSolution بهذا الشكل :
نتجه إلى الForm1 ونقوم بتصمميمه بهذا الشكل :
الان نعرف متغير عام (لاتنسى اضافة الRemote object الى سويناها) :
PHP كود :
RemoteObject.Control _Control;
-
وإذا سألتني وقلت ليش نستورد الRemote object لأنها المفروض تكون class فيها دوال يتم تنفيذها على الServer
واحنا نشتغل على جانب الClient .
اقولك كلامك صحيح . بس احنا منحتاج الclass فقط لعملية الcasting (اي تحويل قيمة من نوع object الى class)
الاسطر الي تحت بتوضح كلامي
-
الان ندخل ونبرمج الزر Start الذي سيقوم بتسجيل قناة بنفس الخطوات المتبعة في الجزء السابق (يعني قم بإضافة المكتبات اللازمة)
PHP كود :
string url = "http://" + textBox1.Text +":6000/vb4arbTest";
HttpChannel channel = new HttpChannel(6000); //البورت الذي ستعمل القناة عليه
ChannelServices.RegisterChannel(channel); //تسجيل القناة
_Control = (RemoteObject.Control)Activator.GetObject(typeof(RemoteObject.Control), url);
كما تلاحظ قمنا بكتابة url وهو يمثل ip السيرفر مع البورت مع الاسم الفريد الذي حددناه في الجزء السابق
يكون الurl بالشكل التالي :-
إقتباس :[protocol]://[serverIp]:[port]/[serverRemotingName]
ip السيرفر تستطيع الحصول عليه من موجة الاوامر عبر الامر ipconfig
نرجع لكودنا ، نلاحظ اننا كتبنا
PHP كود :
_Control = (RemoteObject.Control)Activator.GetObject(typeof(RemoteObject.Control), url);
هذا الكود اعلاه هو لجلب ال Remote object تبع السيرفر ووضعه في Control_
لهذا وضعنا url في البارمتار الثاني لنقول له
"اجلب الRemote object الخاص بالUrl والشبيه بRemoteObject.Control ثم ضعه في Control_"
ومن هنا تتضح فائدة التوريث من MarshalByRefObject
لان كما نعرف ان الفرق بين المرجع والقيمة
هو ان نقل البيانات من مكان الى اخر بالقيمة يعني إنشاء نسخة منها ونقلها
ولكن نقل البيانات بالمرجع هو نقل عنوان البيانات في الذاكرة بدون اخذ نسخة منها
فلو لم نقم بالتوريث من MarshalByRefObject لقام السيرفر
يإنشاء نسخة من Remote object خاصته وإرسالها اللعميل
فالذي سيحصل هو ان اكواد الRemote object سيتم تنفيذها على جهة العميل (نحن)
ونحن لانريد التحكم في انفسنا بل في الجهاز الخادم (سيرفر) ، لذلك قمنا بالتوريث .
خامسا :- استدعاء دوال واجراءات الRemotable Object - (جهة العميل)
الان بكل بساطة بعد ان استطعنا جلب الRemote object (الخاص بالServer) كما فعلنا في الخطوات السابقة
وقمنا بوضعها في Control_ الان يمكننا تنفيذ اي دالة على الجهاز الاخر بكل سهوولة
قم ببرمجة الزر الاول :-
PHP كود :
private void button1_Click(object sender, EventArgs e)
{
_Control.ShutdownComputer();
}
PHP كود :
private void button2_Click(object sender, EventArgs e)
{
_Control.ViewMessage("Hello server , I'm new client");
}
PHP كود :
private void button3_Click(object sender, EventArgs e)
{
_Control.Beeb();
}
هكذا قمنا باستدعاء دوال Remote object (التابع للServer) من خلال الClient
الان اضغط على الButton1 وروح للServer وشوف جهازه بند لو لا ههههه
--
خطوات التحكم :-
الان بعد اكمالنا لجميع الخطوات ، قم ببناء الSolution من خلال
Bulid > Bulid Solution
بعدها اذهب الى مجلد الSolution
وادخل على Server App
قم بنقل برنامج Server App وRemoteobject.dll من مجلد Release
الى اي جهاز معك بالشبكة
شغل البرنامج ، واذا ظهرت لك نافذة التحذير تبع الFireware :
اضغط Allow Access
ثم قم بأخذ ip الجهاز (يمكننا الحصول عليه من خلال الامر Ipconfig ، كما وضحت سابقا)
--
قم بتشغيل برنامج الClient
وقم بإدخال Ip ذلك الجهاز .
وقم بالضغط على Shutdown ليقوم الClient باستدعاء
الدالة Shutdown لتقوم بإطفاء الServer ههههه
والبقية كذلك ايضا
سادسا :- نتيجة الدرس (عرض فيديو)
فيديو من تصويري يعرض جهاز خادم يتم التحكم به من جهاز اخر (العميل)
مشاهدة ممتعة
او من على اليوتيوب مباشرة :
إقتباس :http://www.youtube.com/watch?v=nwvy5TU3__Q
سابعا :- المراجع & الخاتمة
المراجع المعتمد عليها في هذه المقالة :-
NET-Remoting-with-an-easy-example
Remoting in C# and .NET - The Journal of Object Technology
وأخيرا إن اردت إحتراف هذه التقنية الرائعة ، هذا كتاب شامل من 331 صفحة يتكلم عن Remoting بالتفصيل :
Advanced .NET Remoting
--
أتمنى اني وققت في سرد هذه المعلومات الكثيرة عن هذه التقنية
واتمنى من إداريي هذا المنتدى اضافة المحرر المتقدم (html)
لأنني بسبب المحرر الحالي قمت بإعادة تنسيق المقالة من جديد
وعيدكم مبارك وكل سنة وانتو طيبين ، نلقاكم في دروس اكثر اثارة في الاسبوع القادم .
إنتهى