John Squirrels
سطح
San Francisco

جاوا RMI

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

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 اهو خودڪار طريقي سان نه ڪندو - توهان کي هن کي دستي طور شامل ڪرڻ جي ضرورت آهي!).
هاڻي اسان کي هڪ سرور ڪلاس ٺاهڻ جي ضرورت آهي جيڪا اسان جي ڪيلڪيوليٽر انٽرفيس کي لاڳو ڪري. 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);

   }
}
اچو ته اهو سمجهون :) پهرين لڪير ۾، اسان ڪجهه String variable جو اعلان ڪريون ٿا:

public static final String UNIQUE_BINDING_NAME = "server.calculator";
هي اسٽرنگ ريموٽ شئي جو منفرد نالو آهي. اسان جو ڪلائنٽ پروگرام اسان جو سرور ڳولڻ لاءِ هي نالو استعمال ڪري ٿو: توهان هن کي بعد ۾ ڏسندا. اڳيون، اسان پنهنجو ڳڻپيوڪر اعتراض ٺاهيون ٿا:

final RemoteCalculationServer server = new RemoteCalculationServer();
هتي سڀ ڪجهه واضح آهي. جيڪو اڳتي اچي ٿو اهو وڌيڪ دلچسپ آهي:

final Registry registry = LocateRegistry.createRegistry(2732);
هي رجسٽري اعتراض ريموٽ شين جي رجسٽري آهي. اهي شيون آهن جن کي ٻيا پروگرام پري تائين رسائي ڪري سگهن ٿا :) اسان نمبر 2732 کي LocateRegistry.createRegistry() طريقي سان پاس ڪيو. هي پورٽ نمبر آهي - هڪ منفرد نمبر جيڪو ٻيا پروگرام استعمال ڪندا اسان جي اعتراض جي رجسٽري کي ڳولڻ لاءِ (ٻيهر، توهان هن کي هيٺ ڏسندا). ساڄي طرف اڳتي... اچو ته ڏسون ته ايندڙ لائن ۾ ڇا ٿو ٿئي:

Remote stub = UnicastRemoteObject.exportObject(server, 0);
اسان هن لائن ۾ هڪ اسٽب ٺاهيندا آهيون. هڪ اسٽب پوري ريموٽ ڪال کي شامل ڪري ٿو. توھان ھن تي غور ڪري سگھو ٿا RMI جو سڀ کان اهم عنصر. اهو ڇا ٿو ڪري؟
  1. اهو ڪجهه طريقي جي ريموٽ ڪال بابت سڀ معلومات حاصل ڪري ٿو.
  2. جيڪڏهن طريقي ۾ پيرا ميٽرز آهن، اسٽب انهن کي ختم ڪري ڇڏيندو. هن نقطي تي ڌيان ڏيو! اهي دليل جيڪي توهان دور دراز جي طريقن سان منتقل ڪيا آهن سيريلائيبل هجڻ گهرجن (آخرڪار، اهي نيٽ ورڪ تي منتقل ڪيا ويندا). اهو اسان لاءِ ڪو مسئلو ناهي - اسان صرف نمبر منتقل ڪري رهيا آهيون. پر جيڪڏهن توهان شيون منتقل ڪري رهيا آهيو، هن گهرج کي نه وساريو!
  3. ان کان پوء، اسٽب کي گهربل طريقو سڏيندو آهي.
اسان پنھنجي ڳڻپيوڪر سرور اعتراض کي UnicastRemoteObject.exportObject() طريقي سان منتقل ڪريون ٿا. اهو ڪيئن آهي اسان ان کي ممڪن بڻائي remotely ان جي طريقن کي سڏڻ. ڪرڻ لاءِ صرف هڪ ڪم باقي آهي:

registry.bind(UNIQUE_BINDING_NAME, stub);
اسان ريموٽ اعتراض جي رجسٽري ۾ اسان جي اسٽب کي "رجسٽر" ڪريون ٿا ان نالي جي تحت جيڪو اسان شروع ۾ ٺاهيو هو. هاڻي ڪلائنٽ ان کي ڳولڻ جي قابل هوندو! شايد توهان محسوس ڪيو آهي ته اسان پروگرام جي مکيه موضوع کي آخر ۾ ننڊ ڪرڻ لاء رکون ٿا:

Thread.sleep(Integer.MAX_VALUE);
اسان کي صرف هڪ ڊگهي وقت تائين هلائڻ لاءِ سرور جي ضرورت آهي. IDE ۾، اسان هڪ ئي وقت ۾ ٻه مکيه () طريقا شروع ڪنداسين: پهريون، سرور جو مکيه () طريقو (ServerMain ڪلاس ۾ ، جيڪو اسان اڳ ۾ ئي لکيو آهي)، ۽ ٻيو، ڪلائنٽ جو مکيه () طريقو (ClientMain ڪلاس ۾ ، جنهن کي اسين هيٺ لکنداسين). اهو ضروري آهي ته سرور پروگرام ختم نه ڪيو وڃي جڏهن اسان ڪلائنٽ شروع ڪريون ٿا، تنهنڪري اسان ان کي گهڻو وقت تائين ننڊ ۾ رکون ٿا. ڪنهن به صورت ۾، اهو هلندو رهندو :) هاڻي اسان پنهنجي سرور جي مکيه () طريقي سان هلائي سگهون ٿا. ان کي هلڻ ڏيو ۽ ڪلائنٽ پروگرام جو انتظار ڪريو ته ڪو طريقو ڪال ڪري :) هاڻي اچو ته ڪلائنٽ پروگرام لکون! اهو نمبر موڪليندو اسان جي سرور ڏانهن ضرب لاءِ.

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);
   }
}
اهو سادو ڏسڻ ۾ اچي ٿو. پر هتي ڇا ٿي رهيو آهي؟ پهرين، ڪلائنٽ کي ڄاڻڻ گهرجي ته اعتراض جو منفرد نالو جنهن جي طريقن کي اهو دور سڏيندو. ان مطابق، ڪلائنٽ پروگرام ۾، اسان عوامي جامد فائنل اسٽرنگ UNIQUE_BINDING_NAME = "server.calculator"؛ ٺاھيو آھي. متغير. اڳيون، مکيه () طريقي ۾ ، اسان ريموٽ شين جي رجسٽر تائين رسائي حاصل ڪندا آهيون. هن کي ڪرڻ لاءِ، اسان کي ڪال ڪرڻ جي ضرورت آهي LocateRegistry.getRegistry() طريقي سان ۽ سرور مين پروگرام ۾ اسان جي رجسٽري ٺاهڻ لاءِ استعمال ٿيل پورٽ نمبر پاس ڪرڻ (پورٽ 2732؛ هي نمبر صرف هڪ مثال آهي - توهان ڪوشش ڪري سگهو ٿا مختلف نمبر استعمال ڪرڻ جي):

final Registry registry = LocateRegistry.getRegistry(2732);
هاڻي اسان کي صرف رجسٽري مان گهربل اعتراض حاصل ڪرڻ جي ضرورت آهي! اهو آسان آهي، ڇاڪاڻ ته اسان ان جو منفرد نالو ڄاڻون ٿا!

Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);
ٽائيپ ڪاسٽنگ تي ڌيان ڏيو. اسان وصول ڪيل اعتراض کي ڪئلڪيوليٽر انٽرفيس تي اڇلايو، نه RemoteCalculationServer ڪلاس ۾. جيئن اسان سبق جي شروعات ۾ چيو آهي، RMI هڪ پراڪسي تي ڀاڙي ٿو، تنهنڪري ريموٽ ڪالون صرف هڪ انٽرفيس جي طريقن لاءِ موجود آهن، نه ڪي ڪلاس جي طريقن لاءِ. آخرڪار، اسان remotely سڏين ٿا multiply() طريقو اسان جي اعتراض تي ۽ نتيجو ڪڍيو ڪنسول ڏانهن.

int multiplyResult = calculator.multiply(20, 30);
System.out.println(multiplyResult);
سرور مين ڪلاس جو مکيه () طريقو اڳ ۾ ئي ڪافي عرصي کان هلي رهيو آهي. ھاڻي اھو وقت آھي مکيه () طريقي کي ڪلائنٽ پروگرام ۾ هلائڻ جو ( ClientMain )! ڪنسول آئوٽ:

600
بس اهو آهي! اسان جو پروگرام (ٻه پروگرام، اصل ۾!) اهو ڪيو جيڪو اهو ڪرڻ گهرجي ها :) جيڪڏهن توهان وٽ وقت ۽ خواهش آهي، توهان هن کي ٿورو مسالا ڪري سگهو ٿا. مثال طور، ڳڻپيوڪر کي چار معياري رياضياتي عملن جي مدد ڪريو، ۽ نمبر پاس ڪريو ابتدائي قسمن وانگر نه، پر CalculationInstance (int x، int y) شيون. ايندڙ سبق ۾ ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION