"Hai! Dan satu lagi topik yang menyenangkan: RMI. RMI adalah singkatan dari Remote Method Invocation . Dengan kata lain, RMI adalah mekanisme yang memungkinkan suatu objek dari satu mesin Java untuk memanggil metode pada objek dari mesin Java lain , meskipun berbeda komputer, di berbagai negara, atau di belahan dunia yang berbeda."

RMI - 1

"Whoa! Kedengarannya luar biasa."

"Ya. Tapi aku hanya akan mencoba memberimu gambaran umum. Dengan ini, jika kamu menggali terlalu dalam, kamu bisa bingung dengan nuansa cara kerjanya."

"Tetapi jika Anda tidak terlalu ekstrem, maka RMI tidak hanya sangat sederhana, tetapi juga sangat menyederhanakan kehidupan seorang programmer. Untuk itu, kami memberikan penghormatan terdalam kami."

"Jadi, kami ingin satu objek dalam program Java memanggil metode pada objek yang ada di program Java lain. Di mana pun program ini berjalan."

"Mari pertimbangkan contoh paling sederhana: saat kedua program berjalan di komputer yang sama.  Untuk memungkinkan program berinteraksi melalui Internet, Anda perlu mengonfigurasi izin JVM , tetapi kami tidak akan membahasnya hari ini."

"Di Java, Anda hanya dapat memanggil metode antarmuka dari jarak jauh, bukan kelas."

"Jadi, kita punya dua program. Bagaimana mereka bisa memanggil metode satu sama lain?"

"Mari pertimbangkan situasi di mana satu program berisi objek, dan program kedua ingin memanggil metode pada objek itu. Mari kita panggil program pertama sebagai server, dan yang kedua — klien ."

"Pertama, saya akan memberikan beberapa contoh kode, lalu kami akan menganalisisnya."

"Jadi apa yang akan dilakukan program kita?"

"Hmm. Nah, untuk mempermudah, program ini akan memiliki satu metode yang membalikkan sebuah string yang diteruskan ke sana."

"Cukup sederhana."

"Bagus, kalau begitu mari kita mulai:"

"Pertama, kami membutuhkan antarmuka yang akan memenuhi kebutuhan kami:"

Antarmuka untuk komunikasi antar program
interface Reverse extends Remote
{
 public String reverse(String str) throws RemoteException;
}

"Saya membuat antarmuka Terbalik dan menambahkan antarmuka penanda Jarak Jauh ke dalamnya, serta RemoteException. Kesalahan tak terduga dapat terjadi saat metode dipanggil. Jika ada, maka pengecualian ini akan dibuang."

"Sekarang kita perlu menulis kelas server yang mengimplementasikan antarmuka ini:"

Kelas untuk server
class ReverseImpl implements Reverse
{
 public String reverse(String str) throws RemoteException
 {
  return new StringBuffer(str).reverse().toString();
 }
}

"Begitu. Kami membalikkan string dengan metode ini."

"Ya."

"Sekarang kita perlu membuat objek ini dapat dipanggil dari program lain. Berikut cara melakukannya:"

Berbagi objek
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);
}

"Aku akan menjelaskan ini baris demi baris."

" Pada baris 1 , kami menyimpan nama unik (yang kami buat) untuk objek jarak jauh kami (objek yang dapat diakses dari jarak jauh) dalam variabel  UNIC_BINDING_NAME . Jika program membuat beberapa objek dapat diakses, masing-masing harus memiliki nama uniknya sendiri. The our nama unik objek adalah 'server.reverse'."

" Pada baris 6 kita membuat objek ReverseImpl yang dapat diakses dari jarak jauh. Metodenya akan dipanggil."

" Pada baris 9 kita membuat objek khusus yang disebut registri. Kita perlu menggunakannya untuk mendaftarkan objek yang kita bagikan. Nanti JVM akan berinteraksi dengannya. 2099 adalah port (nomor unik yang dapat digunakan program lain untuk mengakses pendaftaran objek)."

"Dengan kata lain, untuk mengakses objek, Anda perlu mengetahui nomor unik (port) registri objek dan nama unik objek, dan memiliki antarmuka yang sama dengan yang diterapkan oleh objek jarak jauh."

"Begitu. Sesuatu seperti: menelepon melalui telepon (butuh nomor) dan menanyakan Bill (nama benda)?"

"Ya. Sekarang, mari kita lanjutkan."

" Pada baris 11  , kita membuat sebuah rintisan. Sebuah rintisan adalah objek khusus yang menerima informasi tentang panggilan jarak jauh, membongkarnya, membatalkan serial argumen metode, dan memanggil metode yang diperlukan. Kemudian membuat serial hasil atau pengecualian, jika ada , dan mengirimkan semuanya kembali ke penelepon."

"Begitu. Hampir. Anda mengatakan bahwa itu 'menghilangkan serial argumen metode'. Jadi, itu berarti argumen metode jarak jauh harus dapat diserialisasi?"

"Ya. Bagaimana lagi Anda mengirimnya melalui jaringan? Benar, ada pengecualian, yaitu objek yang diteruskan dengan referensi, tetapi kami tidak akan membicarakannya hari ini."

"Kami akan mengatakannya seperti ini: Anda tidak dapat melewati objek non-serial, tetapi jika Anda benar-benar menginginkannya, maka Anda bisa. Tapi itu menyebalkan, Anda tahu."

"OKE."

"Kalau begitu mari kita lanjutkan."

" Pada baris 13 , kami mendaftarkan rintisan objek kami dengan nama unik di registri."

" Pada baris 16 , kami menidurkan utas utama. Semua panggilan jarak jauh diproses di utas terpisah. Yang penting adalah program berjalan. Jadi kami cukup menidurkan utas utama di sini. Itu saja."

"OKE."

"Bagus, kalau begitu ini contoh kliennya:"

Bekerja dengan objek jarak jauh
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.");
}

"Saya akan menjelaskan kode ini baris demi baris:"

" Baris 1 adalah nama unik  objek jarak jauh . Ini harus sama pada klien dan server."

" Sejalan 6  , kami membuat « registri objek jarak jauh ». Portanya (2099) harus sama dengan port registri untuk aplikasi server."

" Pada baris 9 , kita mendapatkan objek dari registri. Objek yang dikembalikan adalah objek proxy dan diubah menjadi antarmuka. Antarmuka harus mewarisi antarmuka penanda Jarak Jauh."

" Pada baris 12 , kita memanggil metode antarmuka seolah-olah objek dibuat dalam program yang sama. Tidak ada perbedaan."

"Keren! Sekarang saya bisa menulis aplikasi terdistribusi. Atau game seperti Battleship untuk Android."

"Jangan berani-berani, Amigo! Sistem operasi Android dilarang pada abad ke-27 setelah upaya ketiganya untuk mengambil alih dunia. Robot sama sekali tidak memiliki akses ke sana. Tidak akan ada cara untuk menarik Anda menjauh darinya . Anda akan mulai berlarian sambil berteriak, «Bunuh semua manusia!»"

"Hmm. Oke. Tapi aku masih harus bertanya pada Diego. Kamu tidak pernah tahu, mungkin dia akan mengatakan sesuatu yang menarik tentang itu."

"Kalau begitu tanyakan padanya. Oke, baiklah, sampai besok."

"Sampai jumpa, Rishi. Terima kasih untuk pelajaran yang menarik."