CodeGym /Java Blog /Acak /RMI Jawa
John Squirrels
Level 41
San Francisco

RMI Jawa

Dipublikasikan di grup Acak
Hai! Hari ini kita akan mempertimbangkan topik yang agak menarik: Java RMI. Ini adalah singkatan dari Remote Method Invocation. Anda dapat menggunakan RMI untuk mengizinkan dua program berkomunikasi satu sama lain, meskipun mereka berada di komputer yang berbeda. Apakah itu terdengar keren? :) Dan itu tidak terlalu sulit untuk dilakukan! Dalam pelajaran hari ini, kita akan menganalisis elemen interaksi RMI dan mencari cara untuk mengonfigurasinya. Hal pertama yang kita butuhkan adalah klien dan server. Kami tidak benar-benar perlu mendalami terminologi komputer. Dalam hal RMI, ini hanyalah dua program. Salah satunya akan menyertakan objek, dan yang lainnya akan memanggil metode pada objek itu. Metode pemanggilan objek yang ada di program lain — sekarang ini adalah sesuatu yang belum kita lakukan! Saatnya untuk mencobanya! :) Agar tidak macet, yuk' Jadikan program kami tetap sederhana. Secara umum, server melakukan beberapa perhitungan yang diminta oleh klien. Dan itu akan terjadi pada kita. Server kami akan menjadi program kalkulator sederhana. Ini hanya akan memiliki satu metode:kalikan() . Ini akan mengalikan dua angka yang dikirim oleh program klien, dan kemudian mengembalikan hasilnya. Pertama-tama, kita membutuhkan antarmuka:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculator extends Remote {

   int multiply(int x, int y) throws RemoteException;
}
Mengapa kita membutuhkan antarmuka? Karena RMI mengandalkan pembuatan proxy, yang Anda pelajari di pelajaran sebelumnya . Seperti yang mungkin Anda ingat, kami bekerja dengan proxy melalui antarmuka, bukan kelas. Ada 2 persyaratan penting untuk antarmuka kami!
  1. Itu harus memperluas antarmuka Remote.
  2. Semua metodenya harus membuang RemoteException (IDE tidak akan melakukan ini secara otomatis — Anda perlu menambahkannya secara manual!).
Sekarang kita perlu membuat kelas server yang mengimplementasikan antarmuka Kalkulator kita . RMI dalam praktek - 2Di sini juga, semuanya cukup sederhana:

import java.rmi.RemoteException;

public class RemoteCalculationServer implements Calculator {

   @Override
   public int multiply(int x, int y) throws RemoteException {
       return x*y;
   }

}
Tidak ada yang perlu dikomentari di sini :) Sekarang kita perlu menulis program server yang akan mengonfigurasi dan menjalankan objek kalkulator kita. Ini akan terlihat seperti ini:

import java.rmi.AlreadyBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class ServerMain {

   public static final String UNIQUE_BINDING_NAME = "server.calculator";

   public static void main(String[] args) throws RemoteException, AlreadyBoundException, InterruptedException {

       final RemoteCalculationServer server = new RemoteCalculationServer();

       final Registry registry = LocateRegistry.createRegistry(2732);

       Remote stub = UnicastRemoteObject.exportObject(server, 0);
       registry.bind(UNIQUE_BINDING_NAME, stub);

       Thread.sleep(Integer.MAX_VALUE);

   }
}
Mari kita cari tahu :) Di baris pertama, kita mendeklarasikan beberapa variabel String:

public static final String UNIQUE_BINDING_NAME = "server.calculator";
String ini adalah nama unik objek jarak jauh. Program klien kami menggunakan nama ini untuk menemukan server kami: Anda akan melihatnya nanti. Selanjutnya, kita membuat objek kalkulator kita:

final RemoteCalculationServer server = new RemoteCalculationServer();
Semuanya jelas di sini. Apa yang terjadi selanjutnya lebih menarik:

final Registry registry = LocateRegistry.createRegistry(2732);
Objek Registri ini adalah registri dari objek jarak jauh. Ini adalah objek yang dapat diakses program lain dari jarak jauh :) Kami meneruskan nomor 2732 ke metode LocateRegistry.createRegistry() . Ini adalah nomor port — nomor unik yang akan digunakan program lain untuk menemukan registri objek kami (sekali lagi, Anda akan melihatnya di bawah). Bergerak terus ... Mari kita lihat apa yang terjadi di baris berikutnya:

Remote stub = UnicastRemoteObject.exportObject(server, 0);
Kami membuat rintisan di baris ini. Sebuah rintisan merangkum seluruh panggilan jarak jauh. Anda dapat menganggap ini sebagai elemen terpenting dari RMI. Apa fungsinya?
  1. Ini menerima semua informasi tentang panggilan jarak jauh dari beberapa metode.
  2. Jika metode memiliki parameter, rintisan akan membatalkan serialisasinya. Perhatikan poin ini! Argumen yang Anda berikan ke metode yang dipanggil dari jarak jauh harus dapat diserialkan (lagipula, argumen tersebut akan dikirim melalui jaringan). Ini bukan masalah bagi kami — kami hanya mengirim nomor. Namun jika Anda sedang mengirimkan objek, jangan lupakan persyaratan ini!
  3. Setelah itu, stub memanggil metode yang diinginkan.
Kami meneruskan objek server kalkulator kami ke metode UnicastRemoteObject.exportObject() . Inilah cara kami memungkinkan untuk memanggil metodenya dari jarak jauh. Hanya ada satu hal yang tersisa untuk dilakukan:

registry.bind(UNIQUE_BINDING_NAME, stub);
Kami "mendaftarkan" rintisan kami di registri objek jarak jauh dengan nama yang kami buat di awal. Sekarang klien akan dapat menemukannya! Mungkin Anda memperhatikan bahwa kami menempatkan utas utama program untuk tidur di bagian akhir:

Thread.sleep(Integer.MAX_VALUE);
Kami hanya perlu server berjalan untuk waktu yang lama. Dalam IDE, kita akan secara bersamaan meluncurkan dua metode main() : pertama, metode main() server (di kelas ServerMain , yang telah kita tulis), dan kedua, metode main() klien (di kelas ClientMain , yang akan kami tulis di bawah). Penting bahwa program server tidak dihentikan saat kita memulai klien, jadi kita hanya menidurkannya untuk waktu yang lama. Bagaimanapun, itu akan tetap berjalan :) Sekarang kita dapat menjalankan metode main() server kita . Biarkan berjalan dan tunggu program klien memanggil beberapa metode :) Sekarang mari kita menulis program klien! Ini akan mengirim nomor ke server kami untuk perkalian.

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class ClientMain {

   public static final String UNIQUE_BINDING_NAME = "server.calculator";

   public static void main(String[] args) throws RemoteException, NotBoundException {

       final Registry registry = LocateRegistry.getRegistry(2732);

       Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);

       int multiplyResult = calculator.multiply(20, 30);

       System.out.println(multiplyResult);
   }
}
Ini terlihat sederhana. Tapi apa yang terjadi di sini? Pertama, klien harus mengetahui nama unik objek yang metodenya akan dipanggil dari jarak jauh. Oleh karena itu, dalam program klien, kami membuat String akhir statis publik UNIQUE_BINDING_NAME = "server.calculator"; variabel. Selanjutnya, dalam metode main() , kita mendapatkan akses ke register objek jarak jauh. Untuk melakukannya, kita perlu memanggil metode LocateRegistry.getRegistry() dan meneruskan nomor port yang digunakan untuk membuat registri kita di program ServerMain (port 2732; nomor ini hanyalah sebuah contoh — Anda dapat mencoba menggunakan nomor lain):

final Registry registry = LocateRegistry.getRegistry(2732);
Sekarang kita hanya perlu mendapatkan objek yang diinginkan dari registri! Ini mudah, karena kita tahu namanya yang unik!

Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);
Perhatikan pengecoran tipe. Kami melemparkan objek yang diterima ke antarmuka Kalkulator , bukan ke kelas RemoteCalculationServer . Seperti yang kami katakan di awal pelajaran, RMI mengandalkan proxy, sehingga panggilan jarak jauh hanya tersedia untuk metode antarmuka, bukan metode kelas. Terakhir, kita memanggil metode multiply() dari jarak jauh pada objek kita dan mengeluarkan hasilnya ke konsol.

int multiplyResult = calculator.multiply(20, 30);
System.out.println(multiplyResult);
Metode main() kelas ServerMain sudah berjalan lama. Sekarang saatnya menjalankan metode main() di program klien ( ClientMain )! Keluaran konsol:

600
Itu dia! Program kami (dua program, sebenarnya!) melakukan apa yang seharusnya dilakukan :) Jika Anda punya waktu dan keinginan, Anda dapat sedikit membumbuinya. Misalnya, membuat kalkulator mendukung empat operasi aritmatika standar, dan meneruskan angka bukan sebagai tipe primitif, tetapi sebagai objek CalculationInstance(int x, int y) . Sampai jumpa di pelajaran selanjutnya! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION