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

نسخة كاملة : [سلسلة التحكم] {2} - التحكم بواسطة Remoting
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
بسم الله الرحمن الرحيم

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

والصلاة والسلام على اشرف الخلق محمد وعلى اله الطيبين الطاهرين



--


اهلا وسهلا بكم اخواني الاعزاء في الدرس الثاني من [سلسلة التحكم]

اليوم سنقوم بالتحكم بجهاز اخر على الشبكة المحلية بواسطة فئات مجال الاسماء 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 senderEventArgs e)
        {
            
_Control.ShutdownComputer();
        } 
والثاني :-


PHP كود :
private void button2_Click(object senderEventArgs e)
        {
            
_Control.ViewMessage("Hello server , I'm new client");
        } 
واخيرا الثالث :-



PHP كود :
private void button3_Click(object senderEventArgs 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 ههههه

والبقية كذلك ايضا












سادسا :- نتيجة الدرس (عرض فيديو)


فيديو من تصويري يعرض جهاز خادم يتم التحكم به من جهاز اخر (العميل)

مشاهدة ممتعةBig Grin






او من على اليوتيوب مباشرة :
إقتباس :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)

لأنني بسبب المحرر الحالي قمت بإعادة تنسيق المقالة من جديدAngry

وعيدكم مبارك وكل سنة وانتو طيبين ، نلقاكم في دروس اكثر اثارة في الاسبوع القادم .





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


ما شاء الله، أستاذ بدون جدال.


السلام عليكم ورحمة الله وبركاته
(16-10-13, 02:29 AM)@@أبورائد@@ كتب : [ -> ]السلام عليكم ورحمة الله وبركاته


ما شاء الله، أستاذ بدون جدال.


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

[b]انت استاذي وتشرفني بمرورك


--

تم عمل فيديو نتيجة الدرس (فيديو من تصويري يعرض جهاز سيرفر يتم التحكم به من خلال العميل)




[/b]
مقالة اكثر من رائعة اخى شاكى

وهذا دائمأ ماننتظرة منك
مجهود جباااااااار تشكر عليه Blush
يعطيك العافية اخي بارك الله فيك
اخي الشاكي لله

شكرا لك على هذه الدورس الرائعة الصراحة شاهدت دروس كثيرة للتحكم بالسرفر ولم افهمها كويس الا من هذا الدرس

الشكر لك وايضا تقييم على هذا الدرس والمجهود ولو هناك شرح للدرس فيديو كان افضل
بارك الله فيك و نرغب بمقاللة مشابهه لVB.NET
^ اهلا بك اخي ..


لا داعي لعمل مقالة جديدة للفيجوال بيسك لأن مفهوم الـ Remoting نفسه لايختلف في كلتا اللغتين

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

هذا الموقع يحول الاكواد بشكل ممتاز :
http://converter.telerik.com/

تحياتي