"Merhaba! Ve bir mutlu konu daha: RMI. RMI, Uzak Yöntem Çağırma anlamına gelir . Diğer bir deyişle, RMI, bir Java makinesindeki bir nesnenin, farklı makinelerde olsalar bile, başka bir Java makinesindeki nesneler üzerindeki yöntemleri çağırmasına izin veren bir mekanizmadır. bilgisayarlar, farklı ülkelerde veya dünyanın farklı yerlerinde."

RMI-1

"Vay! Kulağa harika geliyor."

"Evet. Ama sana sadece genel bir bakış sunmaya çalışacağım. Bununla, çok derine inersen, nasıl çalıştığına dair nüanslar yüzünden kafan karışabilir."

"Fakat aşırıya kaçmazsanız, RMI yalnızca çok basit olmakla kalmaz, aynı zamanda bir programcının hayatını da büyük ölçüde basitleştirir. Bunun için ona en derin saygılarımızı sunuyoruz."

"Yani, bir Java programındaki bir nesnenin, başka bir Java programında bulunan bir nesne üzerinde bir yöntemi çağırmasını istiyoruz. Bu programlar nerede çalışırsa çalışsın."

"En basit örneği ele alalım: her iki program da aynı bilgisayarda çalışırken.  Programların İnternet üzerinden etkileşime girmesine izin vermek için, JVM'nin izinlerini yapılandırmanız gerekir , ancak bugün buna değinmeyeceğiz."

"Java'da, sınıfları değil, yalnızca arabirimlerin yöntemlerini uzaktan çağırabilirsiniz."

"Yani iki programımız var. Birbirlerinin metotlarını nasıl çağırabilirler?"

"Bir programın bir nesne içerdiği ve ikinci bir programın bu nesne üzerindeki yöntemleri çağırmak istediği durumu düşünelim . İlk programa sunucu, ikincisine de istemci diyelim. "

"Önce bazı örnek kodlar vereceğim ve sonra onu analiz edeceğiz."

"Peki programımız ne yapacak?"

"Hmm. Basit olsun diye, programın kendisine iletilen bir dizgiyi tersine çeviren bir yöntemi olacak."

"Yeterince basit."

"Güzel, o zaman başlayalım:"

"İlk olarak, gereksinimlerimizi karşılayacak bir arayüze ihtiyacımız var:"

Programlar arası iletişim için arayüz
interface Reverse extends Remote
{
 public String reverse(String str) throws RemoteException;
}

"Bir Ters arabirim oluşturdum ve buna bir Uzak işaretleyici arabiriminin yanı sıra bir RemoteException ekledim. Yöntem çağrıldığında beklenmeyen hatalar meydana gelebilir. Varsa, bu istisna atılacaktır."

"Şimdi bu arabirimi uygulayan bir sunucu sınıfı yazmamız gerekiyor:"

Sunucu için sınıf
class ReverseImpl implements Reverse
{
 public String reverse(String str) throws RemoteException
 {
  return new StringBuffer(str).reverse().toString();
 }
}

"Anlıyorum. Bu yöntemde diziyi tersine çeviriyoruz."

"Evet."

"Şimdi bu nesneyi başka bir programdan çağrılabilir hale getirmemiz gerekiyor. Bunu şu şekilde yapabilirsiniz:"

nesne paylaşımı
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);
}

"Bunu satır satır anlatacağım."

" 1. satırda , UNIC_BINDING_NAME değişkeninde uzak nesnemiz (uzaktan erişilebilen nesne) için benzersiz bir ad (kendi oluşturduğumuz) depolarız .  Program birkaç nesneyi erişilebilir yapıyorsa, her birinin kendi benzersiz adı olmalıdır. nesnenin benzersiz adı 'server.reverse'dir."

" 6. satırda, uzaktan erişilebilecek bir ReverseImpl nesnesi oluşturuyoruz . Yöntemleri çağrılacak."

" 9. satırda , kayıt adı verilen özel bir nesne oluşturuyoruz. Paylaştığımız nesneleri kaydetmek için onu kullanmamız gerekiyor. JVM daha sonra onlarla etkileşime girecek. 2099 bir bağlantı noktasıdır (başka bir programın bizim dosyamıza erişmek için kullanabileceği benzersiz bir numara). nesne kaydı)."

"Başka bir deyişle, bir nesneye erişmek için, nesne kayıt defterinin benzersiz numarasını (port) ve nesnenin benzersiz adını bilmeniz ve uzak nesne tarafından uygulanan arabirimle aynı arayüze sahip olmanız gerekir."

"Anlıyorum. Şunun gibi bir şey: telefonla arayın (bir numaraya ihtiyacınız var) ve Bill'i isteyin (bir nesnenin adı)?"

"Evet. Şimdi devam edelim."

" 11. satırda  bir saplama oluşturuyoruz. Bir saplama, uzak çağrı hakkında bilgi alan, onu paketten çıkaran, yöntem bağımsız değişkenlerini seri durumundan çıkaran ve gerekli yöntemi çağıran özel bir nesnedir. Ardından, varsa sonucu veya istisnayı seri hale getirir ve hepsini arayana geri gönderir."

"Anlıyorum. Neredeyse. Bunun 'yöntem argümanlarının serisini kaldırdığını' söylediniz. Yani bu, uzak yöntemlerin argümanlarının seri hale getirilebilir olması gerektiği anlamına mı geliyor?"

"Evet. Onları ağ üzerinden başka nasıl gönderirsiniz? Doğru, istisnalar var, yani referans olarak iletilen nesneler, ama bugün onlar hakkında konuşmayacağız."

"Şöyle ifade edeceğiz: serileştirilemeyen nesneleri geçemezsiniz, ancak gerçekten isterseniz, o zaman geçebilirsiniz. Ama bu bir acı, bilirsiniz."

"TAMAM."

"Öyleyse devam edelim."

" 13. satırda , nesnemizin saplamasını kayıt defterinde benzersiz bir adla kaydettik."

" 16. satırda , ana diziyi uyku moduna alıyoruz. Tüm uzak aramalar ayrı dizilerde işleniyor. Önemli olan programın çalışıyor olmasıdır. Bu yüzden ana diziyi burada uyku moduna geçiriyoruz. İşte bu kadar."

"TAMAM."

"Harika, o zaman işte bir müşteri örneği:"

Uzak bir nesneyle çalışma
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.");
}

"Bu kodu satır satır açıklayacağım:"

" 1. Satır  , uzak nesnenin benzersiz adıdır . Bu hem istemcide hem de sunucuda aynı olmalıdır."

" 6. satırda bir « uzak nesnelerin kaydını »  oluşturuyoruz . Bağlantı noktası (2099), sunucu uygulaması için kayıt defterinin bağlantı noktası ile aynı olmalıdır."

" 9. satırda , nesneyi kayıt defterinden alıyoruz . Döndürülen nesne bir proxy nesnesidir ve bir arabirime dönüştürülür. Arabirim, Uzak işaretleyici arabirimini devralmalıdır."

" 12. satırda , arayüzün metotlarını sanki nesne aynı program içinde yaratılmış gibi çağırıyoruz. Hiçbir fark yok."

"Harika! Artık dağıtılmış uygulamalar yazabiliyorum. Veya Android için Battleship gibi oyunlar."

"Cesaret etme Amigo! Android işletim sistemi, dünyayı üçüncü kez ele geçirme girişiminden sonra 27. yüzyılda yasaklandı. Robotların ona hiçbir şekilde erişimi yok. Seni ondan uzaklaştırmanın hiçbir yolu yok. "Bütün insanları öldürün!" diye bağırarak ortalıkta koşmaya başlarsınız.

"Hmm. Tamam. Ama yine de Diego'ya sormam gerekecek. Asla bilemezsin, belki onun hakkında söyleyecek ilginç bir şeyi vardır."

"O zaman git ona sor. Tamam, peki, yarına kadar."

"Güle güle Rishi. İlginç ders için teşekkürler."