CodeGym /Blog Jawa /Acak /Jawa RMI
John Squirrels
tingkat
San Francisco

Jawa RMI

Diterbitake ing grup
Hi! Dina iki kita bakal nimbang topik sing rada menarik: Java RMI. Iki singkatan saka Remote Method Invocation. Sampeyan bisa nggunakake RMI kanggo ngidini loro program kanggo komunikasi karo saben liyane, sanajan padha ing komputer beda. Apa sing muni keren? :) Lan iku ora dadi angel kanggo nindakake! Ing wulangan dina iki, kita bakal nganalisa unsur-unsur interaksi RMI lan nemtokake cara ngatur. Babagan pisanan sing kita butuhake yaiku klien lan server. Kita ora perlu nyilem menyang terminologi komputer. Nalika nerangake RMI, iki mung rong program. Salah sijine bakal nyakup obyek, lan liyane bakal nelpon metode ing obyek kasebut. Cara nelpon obyek sing ana ing program sing beda - saiki sing durung rampung! Iku wektu kanggo menehi cobi! :) Supaya ora macet, ayo ' s tetep program kita prasaja. Umumé, server nindakake sawetara petungan sing dijaluk klien. Mangkono uga karo kita. Server kita bakal dadi program kalkulator sing prasaja. Bakal duwe mung siji cara:multiply () . Iku bakal Multiply loro nomer dikirim menyang dening program klien, lan banjur 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? Amarga RMI ngandelake nggawe proxy, sing sampeyan sinau ing pelajaran kepungkur . Sampeyan bisa uga elinga, kita nggarap proxy liwat antarmuka, dudu kelas. Ana 2 syarat penting kanggo antarmuka kita!
  1. Iku kudu ngluwihi antarmuka Remote.
  2. Kabeh cara kudu mbuwang RemoteException (IDE ora bakal nindakake iki kanthi otomatis - sampeyan kudu nambah kanthi manual!).
Saiki kita kudu nggawe kelas server sing ngetrapake antarmuka Kalkulator . RMI ing laku - 2Ing kene, kabeh 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 tenan apa-apa kanggo komentar ing kene :) Saiki kita kudu nulis program server sing bakal ngatur lan mbukak obyek kalkulator 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 ngumumake sawetara variabel String:

public static final String UNIQUE_BINDING_NAME = "server.calculator";
String iki minangka jeneng unik obyek remot. Program klien kita nggunakake jeneng iki kanggo nemokake server kita: sampeyan bakal weruh iki mengko. Sabanjure, kita nggawe obyek kalkulator:

final RemoteCalculationServer server = new RemoteCalculationServer();
Kabeh wis jelas ing kene. Apa sabanjure luwih menarik:

final Registry registry = LocateRegistry.createRegistry(2732);
Obyek Registry iki minangka registri obyek remot. Iki obyek sing program liyane bisa ngakses mbatalake :) We liwati nomer 2732 kanggo LocateRegistry.createRegistry () cara. Iki nomer port - nomer unik sing bakal digunakake program liyane kanggo nemokake registri obyek (maneh, sampeyan bakal weruh ing ngisor iki). Obah tengen ... Ayo ndeleng apa sing kedadeyan ing baris sabanjure:

Remote stub = UnicastRemoteObject.exportObject(server, 0);
Kita nggawe stub ing baris iki. A rintisan encapsulates kabeh telpon remot. Sampeyan bisa nimbang iki unsur paling penting saka RMI. Apa sing ditindakake?
  1. Iki nampa kabeh informasi babagan telpon remot saka sawetara cara.
  2. Yen metode kasebut nduweni paramèter, rintisan bakal deserialize. Wigati ing titik iki! Argumentasi sing sampeyan tindakake menyang metode sing diarani jarak jauh kudu serializable (sawise kabeh, bakal dikirim liwat jaringan). Iki ora masalah kanggo kita - kita mung ngirim nomer. Nanging yen sampeyan ngirim obyek, aja lali syarat iki!
  3. Sawise iku, rintisan nelpon cara sing dikarepake.
We pass obyek server kalkulator kanggo UnicastRemoteObject.exportObject() cara. Iki carane kita nggawe iku bisa kanggo mbatalake nelpon sawijining cara. Mung ana siji bab sing kudu ditindakake:

registry.bind(UNIQUE_BINDING_NAME, stub);
Kita "ndhaptar" rintisan kita ing pendaptaran obyek remot miturut jeneng sing digawe ing wiwitan. Saiki klien bakal bisa nemokake! Mbok menawa sampeyan ngelingi yen kita sijine utas utama program kanggo turu ing pungkasan:

Thread.sleep(Integer.MAX_VALUE);
Kita mung kudu server kanggo mbukak kanggo dangu. Ing IDE, kita bakal bebarengan miwiti loro utama () cara: pisanan, server utama () cara (ing ServerMain kelas, sing wis ditulis), lan liya, klien utama () cara (ing ClientMain kelas, sing bakal ditulis ing ngisor iki). Iku penting sing program server ora mungkasi nalika kita miwiti klien, supaya kita mung sijine iku kanggo turu kanggo dangu. Ing acara apa wae, bakal tetep mlaku :) Saiki kita bisa mbukak metode utama () server . Ayo mbukak lan ngenteni program klien nelpon sawetara cara :) Saiki ayo nulis program klien! Iku bakal ngirim nomer menyang server kita kanggo pingan.

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);
   }
}
Iku katon prasaja. Nanging apa sing kedadeyan ing kene? Pisanan, klien kudu ngerti jeneng unik obyek sing cara kasebut bakal diarani jarak jauh. Patut, ing program klien, kita digawe umum statis final String UNIQUE_BINDING_NAME = "server.calculator"; variabel. Sabanjure, ing cara utama () , kita entuk akses menyang ndhaptar obyek remot. Kanggo nindakake iki, kita kudu nelpon cara LocateRegistry.getRegistry () lan pass nomer port sing digunakake kanggo nggawe pendaptaran ing program ServerMain (port 2732; nomer iki mung conto - sampeyan bisa nyoba nggunakake nomer beda):

final Registry registry = LocateRegistry.getRegistry(2732);
Saiki kita mung kudu njaluk obyek sing dikarepake saka registri! Iki gampang, amarga kita ngerti jeneng unik!

Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);
Pay manungsa waé kanggo jinis casting. Kita ngirim obyek sing ditampa menyang antarmuka Kalkulator , ora menyang kelas RemoteCalculationServer . Nalika kita ngandika ing awal pawulangan, RMI gumantung ing proxy, supaya telpon remot kasedhiya mung kanggo cara antarmuka, ora cara saka kelas. Akhire, kita mbatalake nelpon multiply () cara ing obyek lan output asil kanggo console.

int multiplyResult = calculator.multiply(20, 30);
System.out.println(multiplyResult);
Metode utama () kelas ServerMain wis mlaku suwe. Saiki wektu kanggo mbukak cara utama () ing program klien ( ClientMain )! Output konsol:

600
Mekaten! Program kita (loro program, bener!) Nindakake apa sing kudu dilakoni :) Yen sampeyan duwe wektu lan kepinginan, sampeyan bisa nambah rempah-rempah iki. Contone, nggawe kalkulator ndhukung papat operasi aritmetika standar, lan pass nomer ora minangka jinis primitif, nanging minangka CalculationInstance (int x, int y) obyek. Ditemokake ing wulangan sabanjure! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION