الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Remoting

مغلق
بدأه li8o في 15 يوليو 2005 · 2 رد · 853 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في أغلب البرامج التي نقوم بعملها ، تُستخدم خلال جهاز واحد فقط . قاعدة البيانات و الواجهات كلها في جهاز واحد . طبعاً الحاجة هي التي تفرض علينا ،،

اعتدنا على إنشاء Class ، يختص بالعمليات الخاصة بقواعد البيانات ، مثلا التحقق من المستخدم ، إضافة سجل حذف سجل تعديل ...

أي أن البرنامج اصبح يتكون من

1 – قاعدة البيانات .

2- Forms ( الواجهات ).

والإتصال بقواعد البيانات لا يتم مباشرة من الواجهات ( Forms ) بال عن طريق Class ، يحتوي على جميع

العمليات الخاصة بقاعدة البيانات .. طبعاً هذه الطريقة لها مزايا كثيرة من أهمها سولة التحديث والصيانة ..

إلى هنا لا شئ جديد ولكن ، افرض أنك اضطررت لتوزيع الواجهات على أكثر من كمبيوتر ،

مثلا واجهات الخاصة بالمحاسبة ، عند المحاسب والواجهات الخاصة بالمخازن ، عند المسؤول عن المخزن

وهكذا .. وجميعهم يشتركوا في قاعدة بيانات واحدة ..

في هذه الحالة يجب أن نقوم بإنشاء Class خاص بالربط بن قاعدة البيانات والواجهات في كل جهاز ..

لو قمنا بصنع Class يقوم بالربط بقاعدة البيانات ، لكل جهاز سوف نفقد ميزة المعمارية السابقة .

إذا ما الحل ؟؟

نريد Class واحد يقوم بخدمة جميع الواجهات في أجهزة مختلفة ؟؟

أي ، يكون عندنا جهاز يحتوي على قاعدة البيانات وكذلك Class ، يقوم بالتخاطب بين الواجهات وقاعدة البيانات ،، والأجهزة آخر ، كل جهاز يحتوي على الواجهات الخاصة به .. .

هناك العديد من الحلول ، من ضمنها Remoting

وهو موضوعنا إن شاء الله .. سوف أقوم بصنع برنامج بسيط فقط يقوم بعرض MessageBox في جهاز آخر .. ونفصله بإذن الله ...

#2

بالتوفيق ان شاء الله

موضوع جميل يستدعي الاهتمام أكثر وتوسعة النقاش لان هذه الفئة من بين الفئات الجديدة في .نت

بالتوفيق أخي الكريم

#3

الشرح ...

قم بإنشاء مشروع جديد من نوع Windows Form، قم بتسميته Server

قم بإضافة Reference ل System.Runtime.Remoting

Project -> Add Reference

قم بتنفيذ هذه الخوطة بعد إكمال الخطوة الثانية ...

------------------------------------------------

وكذلك قم بإضافة Reference للملف المنشئ RObject.dll

Project -> Add Reference , Browse -> RObject - > bin ->debug - > RObject.dll

-------------------------------------------------------

قم باستدعاء ال namespace التالية

using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;

أضف هذا الكود ...

private void Form1_Load(object sender, System.EventArgs e)
{
1 : HttpServerChannel channel = new HttpServerChannel(9999);
2 : ChannelServices.RegisterChannel(channel);
3:RemotingConfiguration.RegisterWellKnownServiceType(typeof(RObject),"COM",WellKnownObjectMode.SingleCall);
}

شرح الكود :

السطر الأول ، يجب أن نقوم بإنشاء Channel ، كقناة لتبادل البيانات ... في .NET ، يوجد لدينا نوعين

1- HttpServerChannel

2- TcpServerChannel

كلاهما يقومان بنفس الوظيفة بإختلاف كيفية العمل ، مثلا Http ، تستخدم

http protocol والآخرى تستخدم tcp ،

طبعاً ، طريقة النقل تختلف ، حيث في الأولى تنقل بشكل xml text ، والآخرى بشكل binary

نقل البيانات بشكل binary اسرع بكثير من نقلها بشكل txt ، ولكن تمتاز نقل البيانات بشكل text انها تمر من جدار الحماية بدون أي مشاكل بعكس استخدام TCP .

وعند إنشاء القناة يجب تحديد أي Port سوف تتم تناقل البيانات ..

السطر الثاني : يتم تسجيل Channel.

السطر الثالث : الآن سوف يتم تسجيل Class ،

لاحظ معي الدالة RemotingConfiguration.RegisterWellKnownServiceType

تأخذ ثلاث parameter

الأول : نوع Class ، قم بإدخال اسم Class الذي سوف يتم إستدعائه عن بعد .

الثاني : الإسم الذي سوف يتم تسجيل ال Class

الثالث : طريقة إنشاء الObject في السيرفر ، ويوجد عندنا نوعان

WellKnownObjectMode.SingleCall

في هذا النوع ، لكل طلب ، ينشئ Object .

WellKnownObjectMode.Singleton

أما هذا النوع ، Object واحد يخدم جميع الطلبات ...

الخطوة الثانية قم بإضافة مشروع جديد من نوع Class library ، بإسم ُRObject في نفس المشروع السابق ..

Solution Explorer - > Right Click on Project Name , Add - > New Project

ملاحظة ، يجب أن يرث MarshalByRefObject ،

" قاعدة أي Class سوف يستدعى عن بعد يجب ان يرث MarshalByRefObject" .

public class RObject : MarshalByRefObject
{
public RObject()
{
}
//this just Method to Display the name …
public void ShowName(String Name)
{
MessageBox.Show(Name);
}
}

قم بعملية Compile لهذا Project، لينتج لنا Dll File.

الآن يمكن الرجوع لبرنامج السرفر لإضافة ال Reference

------------------------------------------------

وكذلك قم بإضافة Reference للملف المنشئ RObject.dll

Project -> Add Reference , Browse -> RObject - > bin ->debug - > RObject.dll

-------------------------------------------------------

الخطوة الثالثة والأخيرة ،،،

وهي عمل Client

إنشئ مشروع جديد ، من نوع Windows Forms ، قم بتسميته Client

Solution Explorer - > Right Click on Solution Name , Add - > New Project

قم بإضافة Reference ل System.Runtime.Remoting

Project -> Add Reference

وكذلك قم بإضافة Reference للملف المنشئ RObj.dll

Project -> Add Reference , Browse -> RObject - > bin ->debug - > RObject.dll

قم باستدعاء ال namespace التالية

using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;

الآن قم بإنشاء Global Object من نوع RObject

RObject.RObject RObj;

في constrictor قم بإضافة هذا الكود ...

RObj = (RObject.RObject) Activator.GetObject(typeof(RObject.RObject),"http://localhost:9999/COM");

في هذا الكود سوف يتم إنشاء ما يسمى Proxy ، حيث سوف نقوم بإستخدام ال Class الموجود في جهاز آخر ، ولكن في هذه الحالة

سوف ننفذ البرنامج في نفس الجهاز ..

لاحظ الدالة Activator.GetObject ، والتي تأخذ two parameters

الأول ، وهو نوع Object، في هذه الحالة هو نفس الكلاس الذي سوف يتم إستدعائه عن بعد.

الثاني ، عبارة عن عنوان Remote Object ، لاحظ معي ،

Localhost : عنوان او اسم الكمبيوتر الذي يحتوي على RemoteObject ، تستطيع تغيره بعنوان الجهاز في الشبكة أو IP للجهاز ، حتى في الإنترنت .

9999 : المنفذ الذي تم تسجيله في السيرفر.

COM: الإسم الذي تم تسجيله ل Remote Object

الآن لم يبقى سوى أن تنفذ البرنامج فقط ... يجب ان تنفذ Server أولا ، ومن ثم Client

Solution Explorer - > Right Click on Solution Name , Properties

قم بإختيار multiple Start up project

سوف تجد أمامك قائمة ، Proejct - Action

أمام Server ، قم بإختيار Start

وكذلك Client

واجعل Server يعمل أولا بنقله للأعلى ...

مرفق مع المشارك البرنامج .... اعتذر على التقصير ، ولكن الموضوع طويل ،،

Remoting.zip

هذا الموضوع مغلق.

مواضيع مشابهة