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()); } } }
- Компілюємо класи та інтерфейс із командного рядка - javac *.java
- Генеруємо заглушку і скелетон(каркас) rmic HelloImpl (отримаємо 2 файла - _stub i _skel)
- Запускаємо сервер: java Test server 8888 // будь-який порт > 1023
- На іншому комп’ютері запускаємо клієнта: java Test client xxx.xxx.xxx.xxx 8888 // ваш хост
Важливо: Через фаєрвол це працювати не буде.
Див. також
Джерела
- http://forum.vingrad.ru/faq/topic-157916.html [ 28 лютого 2011 у Wayback Machine.] (рос.)
- Taylor, Ian J. From P2P to Web Services and Grids - Peers in a Client/Server World. Springer, 2005 (англ.)
- http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-smartproxy.html [ 19 вересня 2013 у Wayback Machine.] (англ.)
- The Java RMI tutorial - a good starting point to learn RMI. Also check the Hello World in RMI the Java RMI online training (англ.)
- java.rmi (Sun's Java API Reference for the RMI package) (англ.)
- Wollrath, Ann; Riggs, Roger; Waldo, Jim (PDF). A Distributed Object Model for the Java System. Retrieved 2009-02-11 (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
RMI angl Remote Method Invocation programnij interfejs vikliku viddalenih metodiv u movi Java Opis robotiRozpodilena ob yektna model sho opisuye yakim chinom zdijsnyuyetsya viklik viddalenih metodiv sho pracyuyut na inshij virtualnij mashini Java Pri dostupi do ob yektiv na inshomu komp yuteri mozhna viklikati metodi cogo ob yektu Neobhidno tilki dostaviti parametri metodu na inshij komp yuter povidomiti ob yekt pro neobhidnist vikonannya metodu a potim peredati nazad znachennya yaksho metod ne void Mehanizm RMI daye mozhlivist organizuvati vikonannya vsih cih operacij U terminah RMI ob yekt yakij viklikaye viddalenij metod nazivayetsya a viddalenij ob yekt Komp yuteri vistupayut u roli kliyenta i servera tilki dlya konkretnogo vikliku Cilkom mozhlivo sho pri vikonanni nastupnoyi operaciyi ci komp yuteri pominyayutsya rolyami tobto server mozhe sam stati kliyentom pri zvernenni do ob yektu na inshomu komp yuteri Pri vikliku metodu viddalenogo ob yektu naspravdi viklikayetsya zvichajnij Java metod inkapsulovanij u specialnomu stub yakij ye predstavnikom servernogo ob yektu Zaglushka znahoditsya na kliyentskomu komp yuteri a ne na serveri Vona upakovuye parametri viddalenogo metodu u blok bajtiv Kozhen parametr koduyetsya za dopomogoyu algoritmu sho zabezpechuye nezalezhnist vid aparatnogo zabezpechennya Napriklad chisla zavzhdi peredayutsya v poryadku pri yakomu spochatku peredayetsya starshij bajt big endian Pri comu ob yekti piddayutsya serializaciyi Proces koduvannya parametriv nazivayetsya parameter marshaling Osnovna meta rozgortannya parametriv peretvorennya yih u format pridatnij dlya peredachi parametriv vid odniyeyi virtualnoyi mashini do inshoyi Metod yakij nalezhit zaglushci stvoryuye blok do yakogo vhodyat taki elementi identifikator viddalenogo ob yektu opis metodu yakij viklikayetsya rozgornuti parametri Potim metod zaglushki posilaye cyu informaciyu serveru Dali ob yekt oderzhuvach vikonuye dlya kozhnogo vikliku viddalenogo metodu nastupni diyi poshuk ob yektu yakij viklikayetsya viklik zadanogo metodu vityaguvannya ta rozgortannya znachennya yake povertayetsya abo viklyuchennya zgenerovanogo cim metodom peredacha paketu yakij skladayetsya iz rozgornutih danih yaki povertayutsya ob yektu zaglushci na kliyentskomu komp yuteri Kliyentskij ob yekt zaglushka zgortaye povernene znachennya abo viklyuchennya otrimane iz servera Rezultat zgortannya staye znachennyam metodu zaglushki Yaksho viddalenij metod povertaye viklyuchennya to ob yekt zaglushka povtorit jogo v seredovishi ob yektu kliyenta PrikladInterfejs Hello import java rmi Remote import java rmi RemoteException public interface Hello extends Remote public String helloWorld throws RemoteException Klas HelloImpl import java rmi server UnicastRemoteObject import java rmi RemoteException public class HelloImpl extends UnicastRemoteObject implements Hello public HelloImpl throws RemoteException porozhnye ale musit kidati RemoteException public String helloWorld throws RemoteException return Hello world Klas 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 Klas 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 lt port gt start server client lt host gt lt port gt 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 Kompilyuyemo klasi ta interfejs iz komandnogo ryadka javac java Generuyemo zaglushku i skeleton karkas rmic HelloImpl otrimayemo 2 fajla stub i skel Zapuskayemo server java Test server 8888 bud yakij port gt 1023 Na inshomu komp yuteri zapuskayemo kliyenta java Test client xxx xxx xxx xxx 8888 vash host Vazhlivo Cherez fayervol ce pracyuvati ne bude Div takozhDzherelahttp forum vingrad ru faq topic 157916 html 28 lyutogo 2011 u Wayback Machine ros Taylor Ian J From P2P to Web Services and Grids Peers in a Client Server World Springer 2005 angl http www javaworld com javaworld jw 11 2000 jw 1110 smartproxy html 19 veresnya 2013 u Wayback Machine angl The Java RMI tutorial a good starting point to learn RMI Also check the Hello World in RMI the Java RMI online training angl java rmi Sun s Java API Reference for the RMI package angl Wollrath Ann Riggs Roger Waldo Jim PDF A Distributed Object Model for the Java System Retrieved 2009 02 11 angl