"हाय! आणि आणखी एक आनंदाचा विषय: RMI. RMI म्हणजे रिमोट मेथड इनव्होकेशन . दुसऱ्या शब्दांत, RMI ही एक यंत्रणा आहे जी एका Java मशीनमधील ऑब्जेक्टला दुसर्‍या Java मशीनवरील ऑब्जेक्ट्सवर मेथड कॉल करू देते , जरी ते भिन्न असले तरीही संगणक, वेगवेगळ्या देशांमध्ये किंवा जगाच्या वेगवेगळ्या बाजूंनी."

आरएमआय - १

"अरे! छान वाटतंय."

"हो. पण मी फक्त तुम्हाला एक विहंगावलोकन देण्याचा प्रयत्न करेन. यासह, जर तुम्ही खूप खोल खोदले तर ते कसे कार्य करते या बारकावे पाहून तुम्ही गोंधळून जाऊ शकता."

"परंतु जर तुम्ही टोकाला जात नसाल, तर आरएमआय फक्त खूप साधे नाही, तर ते प्रोग्रामरचे जीवन देखील मोठ्या प्रमाणात सोपे करते. त्यासाठी आम्ही त्याला मनापासून आदर देतो."

"म्हणून, आम्हाला जावा प्रोग्राममधील एक ऑब्जेक्ट दुसर्‍या जावा प्रोग्राममध्ये असलेल्या ऑब्जेक्टवर मेथड कॉल करायचा आहे. हे प्रोग्राम कुठे चालत आहेत याची पर्वा न करता."

"सर्वात सोप्या उदाहरणाचा विचार करूया: जेव्हा दोन्ही प्रोग्राम्स एकाच संगणकावर चालत असतात.  प्रोग्राम्सना इंटरनेटवर संवाद साधण्याची परवानगी देण्यासाठी, तुम्हाला JVM च्या परवानग्या कॉन्फिगर करणे आवश्यक आहे , परंतु आम्ही आज ते कव्हर करणार नाही."

"जावामध्ये, तुम्ही दूरस्थपणे फक्त इंटरफेसच्या पद्धती कॉल करू शकता, वर्ग नाही."

"म्हणून, आमच्याकडे दोन कार्यक्रम आहेत. ते एकमेकांच्या पद्धती कशा म्हणू शकतात?"

"एका प्रोग्राममध्ये एखादी वस्तू असते आणि दुसरा प्रोग्राम त्या ऑब्जेक्टवर मेथड कॉल करू इच्छितो अशा परिस्थितीचा विचार करूया . पहिल्या प्रोग्रामला सर्व्हर आणि दुसऱ्याला क्लायंट म्हणू या ."

"प्रथम, मी काही नमुना कोड देईन, आणि नंतर आम्ही त्याचे विश्लेषण करू."

"मग आमचा कार्यक्रम काय करणार?"

"हम्म. बरं, साधेपणासाठी, प्रोग्राममध्ये एक पद्धत असेल जी त्यास पास केलेल्या स्ट्रिंगला उलट करते."

"पुरेसे सोपे."

"चांगले, चला सुरुवात करूया:"

"प्रथम, आम्हाला एक इंटरफेस आवश्यक आहे जो आमच्या आवश्यकता पूर्ण करेल:"

प्रोग्राम दरम्यान संवाद साधण्यासाठी इंटरफेस
interface Reverse extends Remote
{
 public String reverse(String str) throws RemoteException;
}

"मी एक रिव्हर्स इंटरफेस तयार केला आणि त्यात रिमोट मार्कर इंटरफेस, तसेच एक रिमोट एक्सेप्शन जोडला. पद्धत कॉल केल्यावर अनपेक्षित त्रुटी येऊ शकतात. जर काही केले तर हा अपवाद टाकला जाईल."

"आता आम्हाला हा इंटरफेस लागू करणारा सर्व्हर वर्ग लिहावा लागेल:"

सर्व्हरसाठी वर्ग
class ReverseImpl implements Reverse
{
 public String reverse(String str) throws RemoteException
 {
  return new StringBuffer(str).reverse().toString();
 }
}

"मी पाहतो. आम्ही या पद्धतीत स्ट्रिंग उलट करतो."

"हो."

"आता आम्हाला हा ऑब्जेक्ट दुसर्‍या प्रोग्राममधून कॉल करण्यायोग्य बनवायचा आहे. तुम्ही ते कसे करता ते येथे आहे:"

ऑब्जेक्ट शेअरिंग
public static final String UNIC_BINDING_NAME = "server.reverse";

public static void main(String[] args) throws Exception
{
 // Create an object to be accessible remotely.
 final ReverseImpl service = new ReverseImpl();

 // Create a registry of shared objects.
 final Registry registry = LocateRegistry.createRegistry(2099);
 // Create a stub for receiving remote calls.
 Remote stub = UnicastRemoteObject.exportObject(service, 0);
 // Register the stub in the registry.
 registry.bind(UNIC_BINDING_NAME, stub);

 // Put the main thread to sleep, or else the program will exit.
 Thread.sleep(Integer.MAX_VALUE);
}

"मी ही ओळ ओळीने समजावून सांगेन."

" ओळ 1 मध्ये , आम्ही UNIC_BINDING_NAME व्हेरिएबलमध्ये आमच्या रिमोट ऑब्जेक्टसाठी (आम्ही बनवलेले) एक अनन्य नाव (जो ऑब्जेक्ट दूरस्थपणे प्रवेशयोग्य आहे) संग्रहित करतो .  जर प्रोग्राम अनेक ऑब्जेक्ट्स ऍक्सेस करण्यायोग्य बनवतो, तर प्रत्येकाचे स्वतःचे वेगळे नाव असणे आवश्यक आहे. आमचे ऑब्जेक्टचे अद्वितीय नाव 'server.reverse' आहे."

" 6 व्या ओळीवर आम्ही एक रिव्हर्सइम्पल ऑब्जेक्ट तयार करतो जो दूरस्थपणे प्रवेशयोग्य असेल. त्याच्या पद्धतींचा वापर केला जाईल."

" 9 व्या ओळीवर आम्ही एक विशेष ऑब्जेक्ट तयार करतो ज्याला रेजिस्ट्री म्हणतात. आम्ही सामायिक केलेल्या वस्तूंची नोंदणी करण्यासाठी आम्हाला त्याचा वापर करणे आवश्यक आहे. JVM नंतर त्यांच्याशी संवाद साधेल. 2099 हा एक पोर्ट आहे (एक अनन्य क्रमांक जो दुसरा प्रोग्राम आमच्या ऍक्सेस करण्यासाठी वापरू शकतो. ऑब्जेक्ट रेजिस्ट्री)."

"दुसर्‍या शब्दात, एखाद्या ऑब्जेक्टमध्ये प्रवेश करण्यासाठी, तुम्हाला ऑब्जेक्ट रेजिस्ट्रीचा युनिक नंबर (पोर्ट) आणि ऑब्जेक्टचे युनिक नाव माहित असणे आवश्यक आहे आणि रिमोट ऑब्जेक्टद्वारे लागू केलेला इंटरफेस समान असणे आवश्यक आहे."

"मला दिसत आहे. असे काहीतरी: फोनद्वारे कॉल करा (नंबर पाहिजे) आणि बिल (वस्तूचे नाव) विचारा?"

"हो. आता, चालू ठेवूया."

" 11 व्या ओळीवर  , आम्ही एक स्टब तयार करतो. स्टब ही एक विशेष वस्तू आहे जी रिमोट कॉलबद्दल माहिती प्राप्त करते, ती अनपॅक करते, पद्धत वितर्क डीसीरियल करते आणि आवश्यक पद्धत कॉल करते. नंतर ते परिणाम किंवा अपवाद असल्यास, ते अनुक्रमित करते. , आणि ते सर्व परत कॉलरला पाठवते."

"मी पाहतो. जवळजवळ. तुम्ही म्हणालात की ते 'पद्धतीच्या युक्तिवादांना डीसीरियलाइज करते'. तर, याचा अर्थ रिमोट पद्धतींचे युक्तिवाद अनुक्रमिक असले पाहिजेत?"

"होय. तुम्ही त्यांना नेटवर्कवरून कसे पाठवाल? हे खरे आहे, अपवाद आहेत, म्हणजे संदर्भाद्वारे पास केलेल्या वस्तू, परंतु आम्ही आज त्यांच्याबद्दल बोलणार नाही."

"आम्ही ते असे ठेवू: तुम्ही नॉन-सिरिअलायझेशन ऑब्जेक्ट्स पास करू शकत नाही, परंतु जर तुम्हाला खरोखर करायचे असेल तर तुम्ही करू शकता. पण हे एक वेदना आहे, तुम्हाला माहिती आहे."

"ठीक आहे."

"मग चालू ठेवूया."

" १३ व्या ओळीवर , आम्ही आमच्या ऑब्जेक्टचा स्टब रेजिस्ट्रीमध्ये एका अनन्य नावाने नोंदवतो."

" १६ व्या ओळीवर , आम्ही मुख्य धागा स्लीपसाठी ठेवतो. सर्व रिमोट कॉल्स स्वतंत्र थ्रेडवर प्रक्रिया केली जातात. महत्त्वाची गोष्ट म्हणजे प्रोग्राम चालू आहे. म्हणून आम्ही फक्त मुख्य धागा येथे झोपण्यासाठी ठेवतो. बस्स."

"ठीक आहे."

"छान, मग हे क्लायंटचे उदाहरण आहे:"

रिमोट ऑब्जेक्टसह कार्य करणे
public static final String UNIC_BINDING_NAME = "server.reverse";

public static void main(String[] args) throws Exception
{
 // Create a registry of shared objects
 final Registry registry = LocateRegistry.createRegistry(2099);

 // Get the object (actually, this is a proxy object)
 Reverse service = (Reverse) registry.lookup(UNIC_BINDING_NAME);

 // Call the remote method
 String result = service.reverse("Home sweet home.");
}

"मी हा कोड ओळ ओळीने समजावून सांगेन:"

" लाईन 1  हे रिमोट ऑब्जेक्टचे अनन्य नाव आहे . हे क्लायंट आणि सर्व्हर दोन्हीवर समान असले पाहिजे."

" ६ व्या ओळीत  , आम्ही « ​​रिमोट ऑब्जेक्ट्सची रेजिस्ट्री » तयार करतो. त्याचे पोर्ट (२०९९) सर्व्हर ऍप्लिकेशनसाठी रेजिस्ट्रीच्या पोर्टसारखेच असले पाहिजे."

" 9 व्या ओळीवर , आम्हाला रेजिस्ट्रीमधून ऑब्जेक्ट मिळतो. परत केलेला ऑब्जेक्ट एक प्रॉक्सी ऑब्जेक्ट आहे आणि इंटरफेसमध्ये रूपांतरित केला जातो. इंटरफेसला रिमोट मार्कर इंटरफेस वारसा मिळणे आवश्यक आहे."

" 12 व्या ओळीवर , आम्ही इंटरफेसच्या पद्धतींना असे म्हणतो जसे की ऑब्जेक्ट एकाच प्रोग्राममध्ये तयार केला गेला होता. यात काही फरक नाही."

"छान! आता मी वितरित अनुप्रयोग लिहू शकतो. किंवा Android साठी बॅटलशिप सारखे गेम."

"तुमची हिम्मत करू नका, अमिगो! जगाचा ताबा घेण्याच्या तिसऱ्या प्रयत्नानंतर 27 व्या शतकात अँड्रॉइड ऑपरेटिंग सिस्टीमवर बंदी घालण्यात आली होती. रोबोट्सना त्यात प्रवेश नाही. तुम्हाला त्यापासून दूर खेचण्याचा कोणताही मार्ग नसेल. तुम्ही ओरडत पळू लागाल, "सर्व मानवांना मारून टाका!"

"हम्म. ठीक आहे. पण तरीही मला डिएगोला विचारावे लागेल. तुला माहित नाही, कदाचित त्याला याबद्दल काहीतरी मनोरंजक सांगायचे असेल."

"मग जा त्याला विचारा. ठीक आहे, उद्यापर्यंत."

"बाय, ऋषी. मनोरंजक धड्याबद्दल धन्यवाद."