الشرح بالرد ، لم أستطع إدراجه هنا فأدرجته ف أول رد
شرح مختصر لل rmi
السلام عليكم،
هذا شرح بسيط لل RMI أرجو الاستفاده
المصدر : Head first Design patterns ( بتصريف )
تم كتابة الأمثله باستخدام : gvim ( http://gvim.org )
تم كتاية المفاله باستخدام : OpenOffice.Org
المقاله مع الكود ستجدونه ف المرفقات
بسم الله، نبدأ؛
إعلم – رحمك الله - أن موضوع ال rmi من أسهل المواضيع في الجافا، رغم أنه يبدو ملعبك بعض الشئ، المهم
تمهـــــــــــــــــــــــــــــــيد :
طبعا ال rmi هو علاقه بين إتنين objects ، و عاوز تستدعي داله ( method ) من واحد من خلال التاني ( عادي خالص ) مثال :
عندي ال class ده :
public class Hello {
public String sayHala(String name){
return " Hala brother " + name;
}
}وكمان ال class ده :
public class TheClient {
public static void main (String[] args ){
Hello h = new Hello();
String s = h.sayHala ("mohammed");
System.out.println (s);
}
}كما هو واضح، الكائن ( object ) الثاني يرسل رساله ( يستدعي داله) من الكائن الأول.
هو ده ياعم ال RMI بس في حاجه صغيره جدا الزياده، إن كل واحد منهم علي جهاز، بس كده .
طبعا كما نعلم أنه لكي نستطيع تنفيذ الكود السابق مع الأخذ ف الاعتبار أن كلا من الكائنيين علي جهاز وجب علينا كتابة كود networking و وجع راس و sockets ، كل ده مبتشفهوش مع ال RMI ، شوفت ال RMI حلو إزاي.
فكره عامه :
٥ خطوات، هما ٥ خطوات و كله يبقي ف السليم، ٥ خطوات لعمل تطبيق ب RMI:
١- عمل remote interface :
و هو interface عادي خالص هتحط فيه الدوال ( methods ) اللي إنت عاوز تنفذها ع ال client
٢- عمل implementation لل interface ده :
ده برضه implementation عادي خالص لل interface ؛ إنت عملك implementation لinterface قبل كده !
٣- تنفيذ أمر صغير rmic عشان ننتج stub و skeleton :
و ال stub ده زي متقول كده ( علي منا فاكر) نسخه من ال remote service ( اللي نتج من الخطوه التانيه ) بس موجوده ع الclient
٤- تشغيل الريجيستري ( ده موش الريجستري بتاع ميكروسف ، دا حاجه تانيه platform independent ، هههه ).
٥- تشغيل ال remote servie ( البرنامج الل نتج من الخطوه تنيين – علي رأي إخوانا الصعايده ).
لنبدأ نأخذ كل خطوه بشئ من التفصيل مع شرح مثال ؛؛؛؛؛؛؛؛؛؛؛؛؛؛
****الخطوه الأولي :
****************
عمل remote interface
ال interface ده طبعا هيكون فيه الداله بتاعة ال sayHala ، طبعا من غير متحط فيها كود، عشان ده interface
import java.rmi.*;
public interface MyRemote extends Remote {
public String SayHala (String name ) throws RemoteException;
}لازم تتأكد في الخطوه دي من تلات حاجات :
١- إن الinterface ده بيرث ( extend ) ال interface المسمي java.rmi.Remote
لحسن الحظ إن الانترفيس Remote مفهوش أي داله
٢- كل ال parameters و ال return typs للدوال إما أن تكون premitive أو Serializable ( طبعا ال permitive هما int ,float, double ,.... ) و ال Serializabl هو أي فئه بت implement ال interface المدعاه java.io.Serializale طبعا ال String بطبعته Serializable فموش هنعمله حاجه لكن لو كائن إنت عامله لازم تخليه serializable
٣- كل الدوال لازم ترمي ال exception المسمي java.rmi.RemoteException
****الخطوه الثانيه :
****************
عمل implementation لل remote interface
ده ال implementation و سميت الفئه RemoteHello
import java.rmi.*;
import java.rmi.server.*;
public class RemoteHello extends UnicastRemoteObject implements MyRemote {
public RemoteHello(){} throws RemoteException;
public String sayHala(String name ){
return " Hala brother " + name;
}
public static void main (String [] args ){
try{
MyRemote servie = new RemoteHello();
Naming.rebind ( "remoteHello", servie );
}catch (Exception e ){
// ....
}
}
}*
طبعا الفئه دي بت implement ال interface اللي عملناه في الخطوه الأولي MyRemote
*
برضه لازم يرث الفئه اللي اسمها java.rmi.server.UnicastRemoteObject
*
و بما إن ال constructor بتاع ال super class اللي اسمه UnicastRemoteObject بيرمي RemoteException فلازم الفئه بتاعتنا ترمي نفس ال exception و ده باين ف السطر ده :
public RemoteHello(){} throws RemoteException ;
*
طبعا كتبنا الكود بتاع الداله sayHala
*
فاضل بقي ال main !!
تعالو نفهمها واحده واحده:
أول سطر بنستنسخ الفئه و بينتج كائن اسمه service، أما السطر التاني فبيسجل نسخه من الكائن ده في الريجستري ( هنعرف بعدين) و بيديله اسم : remoteHello عشان بالاسم ده هندور عليه ف الريجستر ي ( اللي هنشغله ف الخطوه٤ )
فكر ف الريجستري على إنه array أو list أو حتي hashtable حطينا فيه الكائن بتاعنا عشان لما نحتاجه نلاقيه تحت رجلينا.
ملــــــــــحــــــــــوظه : إحنا كده لسه علي أول جهاز، الجهاز اللي عليه الكائن الأول ( لو تتذكر في المثال الأولاني خالص الكائن كان اسمه Hello و غيرناه ل RemoteHello )
****الخطوه التالته :
***************
طبعا قم بترجمة ( compile ) للملفين السابقين بالأمر
javac MyRemote.java javac RemoteHello.java
طبعا هينزلك ملفين اسمهم MyRemote.class و RemoteHello.class
ملحوظه : لو مبتعرفش تعمل الخطوتين السابقتين، روووح نام أحسن
المهم بعد كده ( في نفس المجلد الل انت قيه ) إكتب :
rmic RemoteHello
بس كده ياسطي، هتلاقي ملفين جداد نزلولك، واحد اسمه RemoteHello_Stub.class و التاني اسمه RemoteHello_Skel.class
روح لصاحبك اللي عنده ال client ( اللي هوه عنده الفئه اللي اسمها TheClient بتاعت أول المقاله )
و اديله الملف اللي اسمه RemoteHello_Stub.class و خليه يحطه جنب ال TheClient .
****الخطوه الرابعه :
***************
تشغيل الريجيستري
روح لجهازك تاني ، و في نفس المجلد اللي فيه الشغل بتاعك ، إكتب :
rmiregistry
****الخطوه الخامسه :
*****************
روح شغل بقه السرفر ( ال remote service ) عن طريق تشغيل البرنامج HelloRemote كالتالي :
java HelloRemote
طبعا ده بيحصل و انت واقف ف المجلد اللي بيحتوي على الملفات بتاعتك ( MyRemote.java و MyRemote.class و HelloRemote.java إلخ ).
**** الخطوه السادسه ( أه هما ٦ موش خمسه ، هههه )
*******************************************
زي ما عدلنا في ال Hello خليناه RemoteHello لازم نعدل ف ال TheClient اللي موجود عند صاحبك،
إتصل بصاحبك و قولو أنا جايك دلوقتي، خبط ع الباب و لما يفتحلك سلم عليه و روح إفتح جهازه و روح عدل على الفئه TheClient ، خلي بالك الملف اللي اسمه TheClient.java معاه ملف تاني اسمه RemoteHello_Stub.class ف نفس المجلد .
ال TheClient.java لازم يكون كده :
import java.rmi.*;
public class TheClient {
public static void main (String[] args ){
try{
MyRemote h = (MyRemote) Naming.lookup ("rmi://compu10/remoteHello");
String s = h.sayHala ("mohammed");
System.out.println (s);
}catch (Exception e){
// ...
}
}
}ايه اللي احنا بنعمله ؟؟
أول سطر بعد try :
بقوله روح دور ف الجهاز اللي ع الشبكه ( طبعا إنت و صاحبك وخدين وصلات من موزع نت واحد عشان تكونوا في شبكه واحده ) اللي اسمه compu10 ( ده إسم جهازي) علي remote service اسمها remoteHello ( دي اللي سميناها كده في الخطوه ٢ )
و خلقلي كائن منها و حطه ( ضعه) في المتغير h
بس وباقي الكود معروف................................
بس با عم أدي كل ال RMI .
دلوقتي لما صاحبك يروح يشغل الفئه TheClient هو كده بيستدعي الداله sayHala للفئه الموجوده عندك ع الجهاز بتاعك اللي اسمها RemoteHello
ملحوظه : بإمكانك تطبيق هذا كله علي جهاز واحد. ( ده مفهوم طبعا موش هقولك بقي )
الحمد لله الذي بنعمته تتم الصالحات
وصلى الله على سيدنا محمد و على آله و صحبه الكرام.
هذا الموضوع مغلق.