JavaRush /Blog Jawa /Random-JV /RMI: laku nggunakake

RMI: laku nggunakake

Diterbitake ing grup
Hello! Dina iki kita bakal ndeleng topik sing rada menarik - RMI . Iki singkatan saka Remote Method Invocation . RMI: praktik panggunaan - 1Kanthi RMI, sampeyan bisa ngajari rong program kanggo komunikasi, sanajan ana ing komputer sing beda. Swara kelangan? :) Nanging ora angel ditindakake! Ing kuliah dina iki kita bakal ngerti apa bagean saka interaksi RMI lan carane ngatur. Babagan pisanan sing kita butuhake yaiku klien lan server . Sampeyan ora kudu jero banget menyang terminologi komputer. Ing kasus RMI, iki mung rong program. Salah siji saka wong-wong mau bakal ngemot sawetara obyek, lan liya bakal nelpon cara obyek iki. Cara nelpon obyek ing siji program sing ana ing program liyane - kita durung nate nindakake iki! Iku wektu kanggo nyoba! :) Supaya ora drown ing wilds, supaya program kita prasaja. Umumé, server biasane nindakake sawetara jinis kalkulasi sing dijaluk klien. Iku bakal padha kanggo kita. Kita bakal duwe program kalkulator prasaja minangka server. Dheweke bakal duwe mung siji cara - multiply(). Iku bakal Multiply loro nomer dikirim menyang program klien lan bali asil. Kaping pisanan, kita butuh antarmuka:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculator extends Remote {

   int multiply(int x, int y) throws RemoteException;
}
Napa kita butuh antarmuka? Kasunyatane yaiku karya RMI adhedhasar nggawe proxy, sing sampeyan sinau ing salah sawijining kuliah sadurunge . Lan nggarap proxy, sing mbokmenawa sampeyan elinga, ditindakake kanthi tepat ing tingkat antarmuka, dudu kelas. Ana 2 syarat penting kanggo antarmuka kita!
  1. Iku kudu warisan antarmuka token Remote.
  2. Kabeh cara kudu mbuwang RemoteException (iki ora rampung kanthi otomatis ing IDE, sampeyan kudu nulis kanthi manual!).
Saiki kita kudu nggawe kelas server sing bakal ngleksanakake antarmuka kita Calculator. RMI: praktik panggunaan - 2Kabeh ing kene uga cukup prasaja:
import java.rmi.RemoteException;

public class RemoteCalculationServer implements Calculator {

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

}
Ana ora malah akeh komentar ing kene :) Saiki kita kudu nulis program server sing bakal ngatur lan miwiti kelas kalkulator server kita. Bakal katon kaya iki:
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);

   }
}
Ayo dipikirake :) Ing baris pisanan kita nggawe sawetara jinis variabel senar:
public static final String UNIQUE_BINDING_NAME = "server.calculator";
String iki minangka jeneng unik saka obyek remot . Kanthi jeneng iki program klien bakal bisa nemokake server kita: sampeyan bakal weruh iki mengko. Sabanjure, kita nggawe obyek kalkulator:
final RemoteCalculationServer server = new RemoteCalculationServer();
Kabeh wis jelas ing kene. Ing ngisor iki luwih menarik:
final Registry registry = LocateRegistry.createRegistry(2732);
Bab iki sing diarani Registry yaiku registri saka obyek sing wis dibusak . "Dibusak" ora ing pangertèn sing kita dibusak saka komputer, nanging ing kasunyatan sing obyek saka register iki bisa diakses mbatalake saka program liyane :) LocateRegistry.createRegistry()We liwati nomer 2732 kanggo cara iki nomer port. Yen sampeyan ora ngerti apa port, sampeyan bisa maca kene , nanging saiki sampeyan mung kudu ngelingi yen iki nomer unik sing program liyane bisa nemokake registri obyek (sampeyan uga bakal weruh ing ngisor iki). Ayo nerusake. Ayo ndeleng apa sing kedadeyan ing baris sabanjure:
Remote stub = UnicastRemoteObject.exportObject(server, 0);
Ing baris iki kita nggawe rintisan . A rintisan encapsulates kabeh proses telpon remot ing dhewe. Bisa diarani yen iki minangka unsur paling penting saka RMI. Dheweke lagi ngopo?
  1. Nampa kabeh informasi babagan telpon remot menyang cara.
  2. Yen metode kasebut nduweni paramèter, rintisan kasebut deserializes. Wigati ing titik iki! Parameter sing sampeyan pass menyang cara kanggo telpon remot kudu serializable (sawise kabeh, padha bakal ditularaké liwat jaringan). Kita ora duwe masalah kuwi - kita mung ngirim nomer. Nanging yen sampeyan nransfer obyek, aja lali babagan!
  3. Sawise iku, nelpon cara sing dikarepake.
We pass UnicastRemoteObject.exportObject()obyek kalkulator server kanggo cara. Kanthi cara iki, kita bisa nelpon cara kasebut saka jarak jauh. Kita mung duwe siji bab sing kudu ditindakake:
registry.bind(UNIQUE_BINDING_NAME, stub);
Kita "ndhaftar" rintisan kita ing pendaptaran obyek remot miturut jeneng kita teka munggah karo ing awal banget. Saiki klien bisa nemokake! Sampeyan bisa uga wis ngelingi yen ing pungkasan kita sijine utas utama program kanggo turu:
Thread.sleep(Integer.MAX_VALUE);
Kita mung kudu njaga server mlaku nganti suwe. Kita bakal mbukak rong cara ing IDEa bebarengan main(): pisanan server siji (ing kelas ServerMainkita wis ditulis), lan banjur klien siji (ing kelas ClientMainkita bakal nulis ing ngisor iki). Penting yen program server ora mudhun nalika kita mbukak klien, mula kita mung turu nganti suwe. Iku isih bakal bisa :) Saiki kita bisa mbukak main()cara server kita. Ayo mbukak lan ngenteni program klien nelpon sawetara cara :) Saiki ayo nulis program klien! Bakal ngirim nomer menyang server kita kanggo multiply.
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);
   }
}
Dheweke katon ora rumit. Apa sing kedadeyan ing kene? Kaping pisanan, klien kudu ngerti jeneng unik obyek sing cara kasebut bakal diarani jarak jauh. public static final String UNIQUE_BINDING_NAME = "server.calculator"; Mulane, ing program klien kita uga nggawe variabel main(). Kanggo nindakake iki, kita kudu nelpon cara LocateRegistry.getRegistry()lan pass ana nomer port sing ndhaftar kita digawe ing program ServerMain - port 2732 (nomer iki dipilih kanggo conto, sampeyan bisa nyoba nggunakake liyane):
final Registry registry = LocateRegistry.getRegistry(2732);
Saiki sing kudu ditindakake yaiku entuk obyek sing dikarepake saka registrasi! Iku gampang amarga kita ngerti jenenge sing unik!
Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);
Pay manungsa waé kanggo jinis casting. Kita ngirim obyek sing diasilake menyang antarmuka Calculatortinimbang kelas konkrit RemoteCalculationServer . Nalika kita ngandika ing awal kuliah, RMI adhedhasar nggunakake proxy, supaya telpon remot kasedhiya mung kanggo cara antarmuka, ora kelas. Ing pungkasan, kita mbatalake nelpon cara multiply()ing obyek lan print asil kanggo console.
int multiplyResult = calculator.multiply(20, 30);
System.out.println(multiplyResult);
Kita ngluncurake metode kasebut main()ing kelas ServerMainwis suwe, wektune kanggo miwiti metode kasebut main()ing program klien ClientMain! Output konsol: 600 Iku! Program kita (malah loro!) Kasil kawujud sawijining fungsi :) Yen sampeyan duwe wektu lan kepinginan, sampeyan bisa diversifikasi sethitik. Contone, priksa manawa kalkulator ndhukung kabeh papat operasi standar, lan ora nomer, nanging obyek liwati minangka paramèter CalculationInstance(int x, int y). Minangka materi tambahan, sampeyan bisa ndeleng artikel lan conto - kene: Sampai ketemu ing kelas sabanjure! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION