Loading AI tools
З Вікіпедії, вільної енциклопедії
RMI (англ. Remote Method Invocation) - програмний інтерфейс виклику віддалених методів у мові Java.
Розподілена об'єктна модель, що описує, яким чином здійснюється виклик віддалених методів, що працюють на іншій віртуальній машині Java.
При доступі до об'єктів на іншому комп'ютері, можна викликати методи цього об'єкту. Необхідно тільки доставити параметри методу на інший комп'ютер, повідомити об'єкт про необхідність виконання методу, а потім передати назад значення (якщо метод не void). Механізм RMI дає можливість організувати виконання всіх цих операцій.
У термінах RMI об'єкт, який викликає віддалений метод, називається клієнтським об'єктом, а віддалений об'єкт - серверним об'єктом. Комп'ютери виступають у ролі клієнта і сервера тільки для конкретного виклику. Цілком можливо, що при виконанні наступної операції ці комп'ютери поміняються ролями, тобто сервер може сам стати клієнтом при зверненні до об'єкту на іншому комп'ютері.
При виклику методу віддаленого об'єкту, насправді викликається звичайний Java метод, інкапсульований у спеціальному об'єкті-заглушці (stub), який є представником серверного об'єкту. Заглушка знаходиться на клієнтському комп'ютері, а не на сервері. Вона упаковує параметри віддаленого методу у блок байтів. Кожен параметр кодується за допомогою алгоритму, що забезпечує незалежність від апаратного забезпечення. Наприклад, числа завжди передаються в порядку, при якому спочатку передається старший байт (big-endian). При цьому об'єкти піддаються серіалізації. Процес кодування параметрів називається розгортанням параметрів (parameter marshaling). Основна мета розгортання параметрів - перетворення їх у формат, придатний для передачі параметрів від однієї віртуальної машини до іншої.
Метод, який належить заглушці, створює блок, до якого входять такі елементи:
Потім метод заглушки посилає цю інформацію серверу. Далі об'єкт-одержувач виконує для кожного виклику віддаленого методу наступні дії:
Клієнтський об'єкт-заглушка згортає повернене значення або виключення, отримане із сервера. Результат згортання стає значенням методу заглушки. Якщо віддалений метод повертає виключення, то об'єкт-заглушка повторить його в середовищі об'єкту-клієнта.
Інтерфейс Hello:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote
{
public String helloWorld () throws RemoteException;
}
Клас HelloImpl:
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class HelloImpl extends UnicastRemoteObject implements Hello
{
public HelloImpl() throws RemoteException
{
// порожнє, але мусить “кидати” RemoteException
}
public String helloWorld () throws RemoteException
{
return "Hello world!";
}
}
Клас Server:
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.NotBoundException;
public class Server
{
private static final String SERVER_NAME = "Server";
private static final String HOST = "localhost";
private String port;
public Server(String port)
{
this.port = port;
}
public void runServer() throws IllegalArgumentException, NotBoundException, RemoteException
{
HelloImpl helloImpl = new HelloImpl();
Registry registry = LocateRegistry.createRegistry(Integer.parseInt(port, 10));
String url = "//" + HOST + ":" + port + "/" + SERVER_NAME;
registry.rebind(SERVER_NAME, helloImpl);
}
}
Клас Test:
import java.rmi.Naming;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.NotBoundException;
public class Test
{
public static final String SERVER_NAME = "Server";
// use : server <port> - start server
// client <host> <port> - start client
public static void main (String[] args) throws Exception
{
if (args[0].equals("server"))
{
Server server = new Server(args[1]);
server.runServer();
System.out.println("Server started on port " + args[1]);
}
else
{
String lookupString = "//" + args[1] + ":" + args[2] + "/" + SERVER_NAME;
Hello hello = (Hello) Naming.lookup(lookupString);
System.out.println("RMI object found");
System.out.println(hello.helloWorld());
}
}
}
Важливо: Через фаєрвол це працювати не буде.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.