JavaRush /جاوا بلاگ /Random-SD /RMI: استعمال جو مشق

RMI: استعمال جو مشق

گروپ ۾ شايع ٿيل
سلام! اڄ اسان هڪ دلچسپ موضوع تي نظر ڪنداسين - RMI . هي آهي ريموٽ ميٿڊ انوڪيشن . RMI: استعمال جو مشق - 1RMI سان، توهان ٻه پروگرام سيکاري سگهو ٿا هڪ ٻئي سان رابطو ڪرڻ لاءِ، جيتوڻيڪ اهي مختلف ڪمپيوٽرن تي آهن. آواز ٿڌو؟ :) پر اهو ڪرڻ ايترو ڏکيو ناهي! اڄ جي ليڪچر ۾ اسان سمجھنداسين ته RMI رابطي ۾ ڪھڙا حصا شامل آھن ۽ ان کي ڪيئن ترتيب ڏيو. پهرين شيء اسان کي ضرورت آهي هڪ ڪلائنٽ ۽ سرور آهي . توهان کي ڪمپيوٽر جي اصطلاحن ۾ تمام گهڻي اونهي وڃڻ جي ضرورت ناهي. RMI جي صورت ۾، اهي صرف ٻه پروگرام آهن. انھن مان ھڪڙو ڪجھ اعتراض تي مشتمل ھوندو، ۽ ٻيو ھن اعتراض جي طريقن کي سڏيندو. ھڪڙي پروگرام ۾ ھڪڙي شئي جي سڏڻ جا طريقا جيڪي ٻئي پروگرام ۾ واقع آھن - اسان ھن کان اڳ ڪڏهن به نه ڪيو آھي! ان کي ڪوشش ڪرڻ جو وقت آهي! :) جهنگ ۾ غرق نه ڪرڻ لاءِ، اسان جو پروگرام سادو هجي. عام طور تي، سرور عام طور تي ڪجهه قسم جي حساب سان کڻندا آهن جيڪي ڪلائنٽ جي درخواست ڪن ٿا. اسان لاءِ به ائين ئي ٿيندو. اسان وٽ سرور جي طور تي هڪ سادي ڳڻپيندڙ پروگرام هوندو. هن وٽ صرف هڪ طريقو هوندو - multiply(). اهو ڪلائنٽ پروگرام طرفان موڪليل ٻن نمبرن کي ضرب ڏيندو ۽ نتيجو واپس ڪندو. سڀ کان پهريان اسان کي هڪ انٽرفيس جي ضرورت آهي:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculator extends Remote {

   int multiply(int x, int y) throws RemoteException;
}
اسان کي انٽرفيس جي ضرورت ڇو آهي؟ حقيقت اها آهي ته RMI جو ڪم پراکسي ٺاهڻ تي مبني آهي، جيڪو توهان اڳئين ليڪچرن مان هڪ ۾ اڀياس ڪيو آهي . ۽ پراکسيز سان ڪم، جيئن توهان کي ياد هوندو، خاص طور تي انٽرفيس جي سطح تي ڪيو ويندو آهي، نه ڪلاس. اسان جي انٽرفيس لاءِ 2 اھم ضرورتون آھن!
  1. اهو ريموٽ ٽوڪن انٽرفيس کي ورثي ۾ ملڻ گهرجي.
  2. ان جا سڀئي طريقا لازمي طور تي RemoteException اڇلائڻ گهرجن (اهو خودڪار طريقي سان IDE ۾ نه ڪيو ويو آهي، توهان کي اهو دستي طور تي لکڻو پوندو!).
هاڻي اسان کي هڪ سرور ڪلاس ٺاهڻ جي ضرورت آهي جيڪا اسان جي انٽرفيس کي لاڳو ڪندي Calculator. RMI: استعمال جو مشق - 2هتي هر شيء بلڪل سادو آهي:
import java.rmi.RemoteException;

public class RemoteCalculationServer implements Calculator {

   @Override
   public int multiply(int x, int y) throws RemoteException {
       return x*y;
   }

}
هتي تبصرو ڪرڻ لاءِ به گهڻو ڪجهه ناهي :) هاڻي اسان کي هڪ سرور پروگرام لکڻو آهي جيڪو ترتيب ڏيندو ۽ اسان جي سرور ڪيليڪيوليٽر ڪلاس کي لانچ ڪندو. اهو هن طرح نظر ايندو:
import java.rmi.AlreadyBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class ServerMain {

   public static final String UNIQUE_BINDING_NAME = "server.calculator";

   public static void main(String[] args) throws RemoteException, AlreadyBoundException, InterruptedException {

       final RemoteCalculationServer server = new RemoteCalculationServer();

       final Registry registry = LocateRegistry.createRegistry(2732);

       Remote stub = UnicastRemoteObject.exportObject(server, 0);
       registry.bind(UNIQUE_BINDING_NAME, stub);

       Thread.sleep(Integer.MAX_VALUE);

   }
}
اچو ته ان کي سمجهون :) پهرين لڪير ۾ اسان ڪجهه قسم جو اسٽرنگ متغير ٺاهيندا آهيون:
public static final String UNIQUE_BINDING_NAME = "server.calculator";
هي اسٽرنگ ريموٽ اعتراض جو منفرد نالو آهي . هن نالي سان ڪلائنٽ پروگرام اسان جي سرور کي ڳولڻ جي قابل هوندو: توهان هن کي بعد ۾ ڏسندا. اڳيون اسان پنهنجو ڳڻپيوڪر اعتراض ٺاهيندا آهيون:
final RemoteCalculationServer server = new RemoteCalculationServer();
هتي سڀ ڪجهه واضح آهي. هيٺيان وڌيڪ دلچسپ آهي:
final Registry registry = LocateRegistry.createRegistry(2732);
هن شيءِ کي رجسٽري سڏيو ويندو آهي حذف ٿيل شين جي رجسٽري . ”حذف“ ان معنيٰ ۾ نه آهي ته اسان انهن کي ڪمپيوٽر مان ڊليٽ ڪيو آهي، پر حقيقت ۾ ته هن رجسٽر مان شيون ٻين پروگرامن کان ريموٽ طور تي پهچائي سگهجن ٿيون :) LocateRegistry.createRegistry()اسان طريقي سان نمبر 2732 پاس ڪيو آهي، اهو پورٽ نمبر آهي. جيڪڏهن توهان کي خبر ناهي ته بندرگاهه ڇا آهي، توهان ان کي هتي پڙهي سگهو ٿا ، پر هاڻي توهان کي صرف ياد رکڻ جي ضرورت آهي ته اهو هڪ منفرد نمبر آهي جنهن ذريعي ٻيا پروگرام اسان جي اعتراض جي رجسٽري کي ڳولي سگهن ٿا (توهان هيٺ ڏنل پڻ ڏسندا). اچو ته اڳتي وڌون. اچو ته ڏسون ته ايندڙ لائن ۾ ڇا ٿئي ٿو:
Remote stub = UnicastRemoteObject.exportObject(server, 0);
هن لڪير تي اسان هڪ اسٽب ٺاهيندا آهيون . هڪ اسٽب سڄي ريموٽ ڪال جي عمل کي پاڻ ۾ شامل ڪري ٿو. اهو چئي سگهجي ٿو ته اهو RMI جو سڀ کان اهم عنصر آهي. ھوء ڇا پئي ڪري؟
  1. هڪ طريقي سان ريموٽ ڪال بابت سڀ معلومات حاصل ڪري ٿي.
  2. جيڪڏهن طريقي ۾ پيرا ميٽر آهن، اسٽب انهن کي ختم ڪري ٿو. هن نقطي تي ڌيان ڏيو! اهي پيرا ميٽر جيڪي توهان دور دراز ڪالن جي طريقن ڏانهن منتقل ڪندا آهن سيريلائيبل هجڻ گهرجن (آخرڪار، اهي نيٽ ورڪ تي منتقل ڪيا ويندا). اسان وٽ اهڙو مسئلو ناهي - اسان صرف نمبر منتقل ڪريون ٿا. پر جيڪڏهن توهان شيون منتقل ڪريو، ان جي باري ۾ نه وساريو!
  3. ان کان پوء، اهو گهربل طريقو سڏيندو آهي.
اسان UnicastRemoteObject.exportObject()پنھنجي سرور جي حساب ڪتاب کي طريقي سان پاس ڪريون ٿا. هن طريقي سان اسان اهو ممڪن بڻائين ٿا ته ان جي طريقن کي دور کان سڏي سگهجي. اسان وٽ صرف هڪ ڪم باقي آهي:
registry.bind(UNIQUE_BINDING_NAME, stub);
اسان ريموٽ آبجیکٹ رجسٽري ۾ پنهنجي اسٽب کي ”رجسٽر“ ڪندا آهيون جنهن نالي سان اسان شروعات ۾ آيا هئاسين. هاڻي ڪلائنٽ ان کي ڳولي سگهي ٿو! توهان ڏٺو هوندو ته آخر ۾ اسان پروگرام جي مکيه ٿريڊ کي سمهاري ڇڏيو آهي:
Thread.sleep(Integer.MAX_VALUE);
اسان کي صرف سرور کي ڊگهي وقت تائين هلائڻ جي ضرورت آهي. اسان IDEa ۾ هڪ ئي وقت ٻه طريقا هلائينداسين main(): پهريون سرور هڪ (ڪلاس ۾ ServerMainاسان اڳ ۾ ئي لکيو آهي)، ۽ پوءِ ڪلائنٽ هڪ (ڪلاس ۾ ClientMainاسين هيٺ لکنداسين). اهو ضروري آهي ته سرور پروگرام هيٺ نه وڃي جڏهن اسان ڪلائنٽ شروع ڪري رهيا آهيون، تنهنڪري اسان ان کي گهڻو وقت تائين ننڊ ۾ رکون ٿا. اهو اڃا تائين ڪم ڪندو :) هاڻي اسان کي main()اسان جي سرور جو طريقو هلائي سگهو ٿا. ان کي هلائڻ ڏيو ۽ ڪلائنٽ پروگرام جو انتظار ڪريو ڪجھ طريقي سان ڪال ڪرڻ لاءِ :) هاڻي اچو ته ڪلائنٽ پروگرام لکون! اهو نمبر موڪليندو اسان جي سرور ڏانهن ضرب ڪرڻ لاءِ.
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class ClientMain {

   public static final String UNIQUE_BINDING_NAME = "server.calculator";

   public static void main(String[] args) throws RemoteException, NotBoundException {

       final Registry registry = LocateRegistry.getRegistry(2732);

       Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);

       int multiplyResult = calculator.multiply(20, 30);

       System.out.println(multiplyResult);
   }
}
هوءَ غير پيچيده لڳي ٿي. هتي ڇا ٿي رهيو آهي؟ پهرين، ڪلائنٽ کي اعتراض جي منفرد نالو کان واقف هجڻ گهرجي جن جي طريقن کي اهو دور سڏيندو. تنهن ڪري، ڪلائنٽ پروگرام ۾ اسان هڪ متغير پڻ ٺاهيو آهي public static final String UNIQUE_BINDING_NAME = "server.calculator"; ، انهي طريقي سان main()اسان ريموٽ شين جي رجسٽر تائين رسائي حاصل ڪندا آهيون. هن کي ڪرڻ لاء، اسان کي طريقي سان ڪال ڪرڻ جي ضرورت آهي LocateRegistry.getRegistry()۽ اتي پورٽ نمبر پاس ڪرڻ جي ضرورت آهي جنهن تي اسان جو رجسٽرڊ سرور مين پروگرام ۾ ٺاهيو ويو آهي - پورٽ 2732 (هي نمبر مثال طور چونڊيو ويو آهي، توهان ڪوشش ڪري سگهو ٿا ٻيو نمبر استعمال ڪندي):
final Registry registry = LocateRegistry.getRegistry(2732);
هاڻي اسان کي اهو ڪرڻو آهي ته رجسٽر مان گهربل اعتراض حاصل ڪريو! اهو آسان آهي ڇو ته اسان ڄاڻون ٿا سندس منفرد نالو!
Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);
ٽائيپ ڪاسٽنگ تي ڌيان ڏيو. اسان نتيجي واري شئي کي ڪنڪريٽ ڪلاس جي بجاءِ انٽرفيسCalculator RemoteCalculationServer تي اڇلايو . جيئن ته اسان ليڪچر جي شروعات ۾ چيو، RMI هڪ پراکسي جي استعمال تي ٻڌل آهي، تنهنڪري هڪ ريموٽ ڪال صرف انٽرفيس جي طريقن لاءِ دستياب آهي، نه ڪلاسن لاءِ. آخر ۾، اسان ريموٽ طور تي multiply()اسان جي اعتراض تي هڪ طريقو سڏين ٿا ۽ نتيجو پرنٽ ڪنسول ڏانهن.
int multiplyResult = calculator.multiply(20, 30);
System.out.println(multiplyResult);
main()اسان هڪ ڊگهو وقت اڳ ڪلاس ۾ طريقو شروع ڪيو، اهو وقت آهي ڪلائنٽ پروگرام ۾ ServerMainطريقو شروع ڪرڻ جو ! ڪنسول آئوٽ: 600 اهو ئي آهي! اسان جو پروگرام (جيتوڻيڪ ٻه!) ڪاميابيءَ سان ان جي فنڪشن کي پورو ڪيو :) جيڪڏهن توهان وٽ وقت ۽ خواهش آهي، ته توهان ان کي ٿورو متنوع ڪري سگهو ٿا. مثال طور، پڪ ڪريو ته ڳڻپيوڪر سڀني چئن معياري عملن کي سپورٽ ڪري ٿو، ۽ نمبر نه، پر هڪ اعتراض کي پيرا ميٽر طور منظور ڪيو ويو آهي . اضافي مواد جي طور تي، توهان مضمونن ۽ مثالن کي ڏسي سگهو ٿا - هتي: main()ClientMainCalculationInstance(int x, int y) ايندڙ ڪلاسن ۾ ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION