"ஹாய்! மேலும் ஒரு மகிழ்ச்சியான தலைப்பு: RMI. RMI என்பது தொலைநிலை முறை அழைப்பைக் குறிக்கிறது . வேறு வார்த்தைகளில் கூறுவதானால், RMI என்பது ஒரு ஜாவா இயந்திரத்தில் உள்ள ஒரு பொருளை மற்றொரு ஜாவா இயந்திரத்தில் இருந்து பொருள்களை அழைக்கும் முறைகளை அனுமதிக்கிறது. கணினிகள், வெவ்வேறு நாடுகளில், அல்லது உலகின் வெவ்வேறு பக்கங்களில்."

RMI - 1

"ஐயோ! அருமையாக இருக்கிறது."

"ஆமாம். ஆனால் நான் உங்களுக்கு ஒரு மேலோட்டத்தை மட்டுமே கொடுக்க முயற்சிக்கிறேன். இதை வைத்து, நீங்கள் மிகவும் ஆழமாக தோண்டினால், அது எவ்வாறு செயல்படுகிறது என்ற நுணுக்கங்களால் நீங்கள் குழப்பமடையலாம்."

"ஆனால் நீங்கள் உச்சநிலைக்குச் செல்லவில்லை என்றால், RMI மிகவும் எளிமையானது மட்டுமல்ல, ஒரு புரோகிராமரின் வாழ்க்கையை பெரிதும் எளிதாக்குகிறது. அதற்காக, நாங்கள் அதற்கு ஆழ்ந்த மரியாதை செலுத்துகிறோம்."

"எனவே, ஒரு ஜாவா நிரலில் உள்ள ஒரு பொருள் மற்றொரு ஜாவா நிரலில் உள்ள ஒரு பொருளின் மீது ஒரு முறையை அழைக்க வேண்டும். இந்த திட்டங்கள் எங்கு இயங்குகின்றன என்பதைப் பொருட்படுத்தாமல்."

"எளிமையான உதாரணத்தைக் கருத்தில் கொள்வோம்: இரண்டு நிரல்களும் ஒரே கணினியில் இயங்கும் போது.  நிரல்களை இணையத்தில் தொடர்பு கொள்ள அனுமதிக்க, நீங்கள் 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 இல் ரிமோட் மூலம் அணுகக்கூடிய ஒரு ReverseImpl பொருளை உருவாக்குகிறோம் . அதன் முறைகள் செயல்படுத்தப்படும்."

" வரி 9 இல் , ரெஜிஸ்ட்ரி எனப்படும் ஒரு சிறப்புப் பொருளை உருவாக்குகிறோம். நாம் பகிரும் பொருட்களைப் பதிவு செய்ய அதைப் பயன்படுத்த வேண்டும். JVM பின்னர் அவற்றுடன் தொடர்பு கொள்ளும். 2099 என்பது ஒரு போர்ட் (மற்றொரு நிரல் எங்கள் அணுகலைப் பயன்படுத்தக்கூடிய தனித்துவமான எண். பொருள் பதிவு)."

"வேறு வார்த்தைகளில் கூறுவதானால், ஒரு பொருளை அணுக, நீங்கள் பொருள் பதிவேட்டின் தனிப்பட்ட எண் (போர்ட்) மற்றும் பொருளின் தனிப்பட்ட பெயரை அறிந்து கொள்ள வேண்டும், மேலும் தொலை பொருளால் செயல்படுத்தப்பட்ட அதே இடைமுகம் இருக்க வேண்டும்."

"எனக்கு தெரிகிறது. இது போன்றது: தொலைபேசியில் அழைக்கவும் (ஒரு எண் தேவை) மற்றும் பில் (ஒரு பொருளின் பெயர்) கேட்கவும்?"

"ஆமாம். இப்போ, தொடரலாம்."

" வரி 11 இல்  , நாங்கள் ஒரு ஸ்டப்பை உருவாக்குகிறோம். ஒரு ஸ்டப் என்பது தொலைநிலை அழைப்பைப் பற்றிய தகவலைப் பெறும் ஒரு சிறப்புப் பொருளாகும், அதைத் திறக்கிறது, முறை வாதங்களை நீக்குகிறது மற்றும் தேவையான முறையை அழைக்கிறது. பின்னர் அது முடிவு அல்லது விதிவிலக்கை வரிசைப்படுத்துகிறது. , மற்றும் அழைப்பாளருக்கு அனைத்தையும் திருப்பி அனுப்புகிறது."

"நான் பார்க்கிறேன். ஏறக்குறைய. இது 'முறை வாதங்களை சீரழிக்கிறது' என்று நீங்கள் சொன்னீர்கள். எனவே, தொலைநிலை முறைகள்' வாதங்கள் வரிசைப்படுத்தப்பட வேண்டும் என்று அர்த்தம்?"

ஆம்

"நாங்கள் இதை இப்படி வைப்போம்: சீரியஸ் செய்ய முடியாத பொருட்களை நீங்கள் அனுப்ப முடியாது, ஆனால் நீங்கள் உண்மையிலேயே விரும்பினால், உங்களால் முடியும். ஆனால் அது ஒரு வலி, உங்களுக்குத் தெரியும்."

"சரி."

"அப்படியானால் தொடரலாம்."

" வரி 13 இல் , பதிவேட்டில் ஒரு தனித்துவமான பெயரில் எங்கள் பொருளின் ஸ்டப்பைப் பதிவு செய்கிறோம்."

" லைன் 16 இல் , முக்கியத் தொடரை உறங்க வைக்கிறோம். எல்லா ரிமோட் அழைப்புகளும் தனித்தனி த்ரெட்களில் செயலாக்கப்படும். முக்கிய விஷயம் என்னவென்றால், நிரல் இயங்குகிறது. எனவே பிரதான நூலை இங்கே தூங்க வைக்கிறோம். அவ்வளவுதான்."

"சரி."

"நல்லது, வாடிக்கையாளரின் உதாரணம் இங்கே:"

தொலைதூர பொருளுடன் வேலை செய்தல்
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  என்பது தொலைநிலை பொருளின் தனிப்பட்ட பெயர் . இது கிளையன்ட் மற்றும் சர்வர் இரண்டிலும் ஒரே மாதிரியாக இருக்க வேண்டும்."

" வரி 6 இல் , " ரிமோட் பொருள்களின் பதிவேட்டை "  உருவாக்குகிறோம் . அதன் போர்ட் (2099) சர்வர் பயன்பாட்டிற்கான பதிவேட்டின் போர்ட்டைப் போலவே இருக்க வேண்டும்."

" வரி 9 இல் , பதிவேட்டில் இருந்து பொருளைப் பெறுகிறோம் . திரும்பிய பொருள் ஒரு ப்ராக்ஸி பொருள் மற்றும் ஒரு இடைமுகமாக மாற்றப்படுகிறது. இடைமுகம் ரிமோட் மார்க்கர் இடைமுகத்தைப் பெற வேண்டும்."

" வரி 12 இல் , பொருள் ஒரே நிரலுக்குள் உருவாக்கப்பட்டதைப் போல இடைமுகத்தின் முறைகளை அழைக்கிறோம். எந்த வித்தியாசமும் இல்லை."

"அருமை! இப்போது என்னால் விநியோகிக்கப்பட்ட பயன்பாடுகளை எழுத முடியும். அல்லது ஆண்ட்ராய்டுக்கான பேட்டில்ஷிப் போன்ற கேம்கள்."

"உனக்கு தைரியம் இல்லையா, அமிகோ! ஆண்ட்ராய்டு இயங்குதளம் 27 ஆம் நூற்றாண்டில் உலகைக் கைப்பற்ற அதன் மூன்றாவது முயற்சிக்குப் பிறகு தடைசெய்யப்பட்டது. ரோபோக்களுக்கு அதை அணுக முடியாது. அதிலிருந்து உங்களை இழுக்க எந்த வழியும் இருக்காது. "எல்லா மனிதர்களையும் கொன்று விடுங்கள்!" என்று கத்திக்கொண்டே ஓடத் தொடங்குவீர்கள்.

"ம்ம். சரி. ஆனால் நான் இன்னும் டியாகோவிடம் கேட்க வேண்டும். உங்களுக்குத் தெரியாது, ஒருவேளை அவர் அதைப் பற்றி சுவாரஸ்யமாக ஏதாவது சொல்லலாம்."

"அப்படியானால் அவரிடம் போய் கேளுங்கள். சரி, சரி, நாளை வரை."

"பை, ரிஷி. சுவாரஸ்யமான பாடத்திற்கு நன்றி."