"Hai! Dan satu lagi topik yang menggembirakan: RMI. RMI adalah singkatan dari Remote Method Invocation . Dalam erti kata lain, RMI ialah mekanisme yang membenarkan objek daripada satu mesin Java untuk memanggil kaedah pada objek daripada mesin Java yang lain , walaupun ia berada pada berbeza. komputer, di negara yang berbeza, atau di sisi dunia yang berbeza."

RMI - 1

"Wah! Bunyinya hebat."

"Ya. Tetapi saya hanya akan cuba memberi anda gambaran keseluruhan. Dengan ini, jika anda menggali terlalu dalam, anda boleh keliru dengan nuansa cara ia berfungsi."

"Tetapi jika anda tidak melampau, maka RMI bukan sahaja sangat mudah, tetapi ia juga sangat memudahkan kehidupan seorang pengaturcara. Untuk itu, kami memberi penghormatan setinggi-tingginya."

"Jadi, kami mahu satu objek dalam program Java memanggil kaedah pada objek yang berada dalam program Java yang lain. Tidak kira di mana program ini berjalan."

"Mari kita pertimbangkan contoh paling mudah: apabila kedua-dua atur cara berjalan pada komputer yang sama.  Untuk membenarkan atur cara berinteraksi melalui Internet, anda perlu mengkonfigurasi kebenaran JVM , tetapi kami tidak akan membincangkannya hari ini."

"Di Java, anda hanya boleh memanggil kaedah antara muka, bukan kelas."

"Jadi, kita ada dua program. Bagaimana mereka boleh memanggil kaedah masing-masing?"

"Mari kita pertimbangkan situasi di mana satu program mengandungi objek, dan program kedua mahu memanggil kaedah pada objek itu. Mari kita panggil program pertama pelayan, dan yang kedua — klien. "

"Pertama, saya akan memberikan beberapa kod sampel, dan kemudian kami akan menganalisisnya."

"Jadi apa program kita akan buat?"

"Hmm. Nah, untuk kesederhanaan, program ini akan mempunyai satu kaedah yang membalikkan rentetan yang dihantar kepadanya."

"Cukup mudah."

"Baik, mari kita mulakan:"

"Pertama, kami memerlukan antara muka yang akan memenuhi keperluan kami:"

Antara muka untuk komunikasi antara program
interface Reverse extends Remote
{
 public String reverse(String str) throws RemoteException;
}

"Saya mencipta antara muka Songsang dan menambah antara muka penanda Jauh padanya, serta RemoteException. Ralat yang tidak dijangka boleh berlaku apabila kaedah dipanggil. Jika ada, maka pengecualian ini akan dibuang."

"Sekarang kita perlu menulis kelas pelayan yang melaksanakan antara muka ini:"

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

"Saya faham. Kami membalikkan rentetan dalam kaedah ini."

"Ya."

"Sekarang kita perlu menjadikan objek ini boleh dipanggil daripada program lain. Begini cara anda melakukannya:"

Perkongsian 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);
}

"Saya akan menerangkan ini baris demi baris."

" Dalam baris 1 , kami menyimpan nama unik (yang kami reka) untuk objek jauh kami (objek yang boleh diakses dari jauh) dalam pembolehubah  UNIC_BINDING_NAME . Jika program menjadikan beberapa objek boleh diakses, setiap satu mesti mempunyai nama uniknya sendiri. nama unik objek ialah 'server.reverse'."

" Pada baris 6 kami mencipta objek ReverseImpl yang boleh diakses dari jauh. Kaedahnya akan digunakan."

" Pada baris 9 kami mencipta objek khas yang dipanggil pendaftaran. Kami perlu menggunakannya untuk mendaftarkan objek yang kami kongsi. JVM akan berinteraksi dengan mereka kemudian. 2099 ialah port (nombor unik yang boleh digunakan oleh program lain untuk mengakses kami pendaftaran objek)."

"Dengan kata lain, untuk mengakses objek, anda perlu mengetahui nombor unik (port) pendaftaran objek dan nama unik objek, dan mempunyai antara muka yang sama seperti yang dilaksanakan oleh objek jauh."

"Saya faham. Sesuatu seperti: hubungi melalui telefon (perlukan nombor) dan minta Bill (nama objek)?"

"Ya. Sekarang, mari kita sambung."

" Pada baris 11  , kami mencipta stub. Stub ialah objek khas yang menerima maklumat tentang panggilan jauh, membongkarnya, menyahsiri hujah kaedah dan memanggil kaedah yang diperlukan. Kemudian ia menyerikan hasil atau pengecualian, jika terdapat satu , dan menghantar semuanya kembali kepada pemanggil."

"Saya faham. Hampir. Anda mengatakan bahawa ia 'menyahserialisasikan hujah kaedah'. Jadi, itu bermakna hujah kaedah jauh' mesti boleh bersiri?"

"Ya. Bagaimana lagi anda akan menghantarnya melalui rangkaian? Benar, terdapat pengecualian, iaitu objek yang diluluskan melalui rujukan, tetapi kami tidak akan membincangkannya hari ini."

"Kami akan meletakkannya seperti ini: anda tidak boleh melepasi objek yang tidak boleh bersiri, tetapi jika anda benar-benar mahu, maka anda boleh. Tetapi ia menyakitkan, anda tahu."

"OKEY."

"Kalau begitu mari kita teruskan."

" Pada baris 13 , kami mendaftarkan stub objek kami di bawah nama unik dalam pendaftaran."

" Pada baris 16 , kami meletakkan utas utama untuk tidur. Semua panggilan jauh diproses pada utas yang berasingan. Yang penting ialah program sedang berjalan. Jadi kami hanya meletakkan utas utama untuk tidur di sini. Itu sahaja."

"OKEY."

"Bagus, maka berikut ialah contoh pelanggan:"

Bekerja dengan objek 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 menerangkan kod ini baris demi baris:"

" Baris 1 ialah nama unik  objek jauh . Ini mestilah sama pada kedua-dua klien dan pelayan."

" Dalam baris 6  , kami mencipta « pendaftaran objek jauh ». Portnya (2099) mestilah sama dengan port pendaftaran untuk aplikasi pelayan."

" Pada baris 9 , kami mendapat objek daripada pendaftaran. Objek yang dikembalikan ialah objek proksi dan ditukar kepada antara muka. Antara muka mesti mewarisi antara muka penanda Jauh."

" Pada baris 12 , kami memanggil kaedah antara muka seolah-olah objek dicipta dalam program yang sama. Tiada perbezaan."

"Sejuk! Sekarang saya boleh menulis aplikasi yang diedarkan. Atau permainan seperti Battleship untuk Android."

"Jangan berani, Amigo! Sistem pengendalian Android telah diharamkan pada abad ke-27 selepas percubaan ketiga untuk mengambil alih dunia. Robot tidak mempunyai akses kepadanya sama sekali. Tidak akan ada cara untuk menarik anda daripadanya . Anda akan mula berlari-lari sambil menjerit, «Bunuh semua manusia!»"

"Hmm. OK. Tapi saya tetap kena tanya Diego. Awak tak pernah tahu, mungkin dia ada sesuatu yang menarik untuk diperkatakan."

"Kalau macam tu pergi tanya dia. Okay, sampai esok."

"Bye, Rishi. Terima kasih atas pengajaran yang menarik."