Све о Јава РМИ регистру и како га користити

Све о Јава РМИ регистру и како га користити

РМИ означава позивање удаљене методе и, као што име говори, је протокол за Јава програм да позове методу објекта који ради на другом рачунару. Он пружа АПИ (интерфејс за програмирање апликације) за извоз објекта из једног програма (који се назива сервер) и позивање метода тог објекта из другог програма (званог клијент), који се вероватно изводи на другом рачунару.





Јава РМИ Регистри је кључна компонента Јава РМИ система и пружа централизовани директоријум за сервере за регистрацију услуга и за клијенте за тражење ових услуга. У овом чланку учимо како имплементирати сервер за излагање објекта и клијента да позове методу на серверу, као и регистрацију и тражење услуге у РМИ регистру.





могу ли да променим своје порекло

Декларисање серверског интерфејса

Да бисмо научили замршеност начина рада Јава РМИ система, имплементирајмо једноставан објекат сервера који пружа методу за прихватање имена и узвраћање поздрава. Ево дефиниције интерфејса објекта:





import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Greeting extends Remote
{
public String greet(String name) throws RemoteException;
}

Зове се име интерфејса Поздрав . Он пружа једну методу тзв поздрав () која прихвата име и узвраћа одговарајући поздрав.

Да би се ово сучеље означило као извозно, потребно је проширити јава.рми.Ремоте приступ. Такође метода треба да објави а баца листа клаузула јава.рми.РемотеЕкцептион поред свих изузетака специфичних за апликацију. Тако клијентов код може да обради (или прошири) грешке при позивању удаљене методе, као што је хост-нот-фоунд , веза-квар итд.



Имплементација серверског објекта

Након декларисања интерфејса (који користе клијенти), имплементирамо објекат на страни сервера и обезбеђујемо поздрав () метод као што је приказано. За обликовање поздрава користи низ једноставног формата.

public class GreetingObject implements Greeting
{
private String fmtString = 'Hello, %s';
public String greet(String name)
{
return String.format(this.fmtString, name);
}
}

Главни метод сервера

Хајде сада да упоредимо све ове делове заједно и применимо главни() метод сервера. Прођимо кроз сваки од релевантних корака.





  • Први корак је креирање имплементације серверског објекта. | _+_ |
  • Затим добијамо стуб за серверски објекат из времена извођења РМИ. Стуб имплементира исти интерфејс као и сервер објекат. Међутим, метода имплементира потребну комуникацију са објектом удаљеног сервера. Овај стуб користи клијент за транспарентно позивање методе на објекту сервера. | _+_ |
  • Када добијемо стуб, предајемо га у РМИ регистар за повезивање са наведеном именованом услугом. Када клијент затражи имплементацију ове услуге, добија стуб који зна како да комуницира са објектом сервера. У наставку, статички метод ЛоцатеРегистри.гетРегистри () се користи за добијање референце локалног регистра. Тхе ребинд () метода се затим користи за везивање имена за стуб. | _+_ |

Комплетна главна метода.

Greeting greeting = new GreetingObject();

Изградња сервера

Погледајмо сада изградњу сервера. Да поједноставимо ствари, градимо помоћу командне линије на Линук -у, а не помоћу алата за изградњу, попут Мавена.





У наставку су компајлиране изворне датотеке у датотеке класа у циљном директоријуму.

Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);

Сакупите датотеке класе у ЈАР датотеку за извршавање.

String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);

Такође прикупљамо датотеке интерфејса потребне за компајлирање клијента у ЈАР библиотеке.

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Main
{
static public void main(String[] args) throws Exception
{
if ( args.length == 0 ) {
System.err.println('usage: java Main port#');
System.exit(1);
}
int index = 0;
int port = Integer.parseInt(args[index++]);
String name = 'Greeting';
Greeting greeting = new GreetingObject();
Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);
System.out.println('Greeting bound to '' + name + ''');
}
}

Имплементација Клијента

Погледајмо сада имплементацију клијента који се користи за позивање метода серверског објекта.

  • Као и код сервера, потражите референцу у регистру, наводећи име хоста на којем је регистар покренут и број порта. | _+_ |
  • Затим потражите услугу у регистру. Тхе потражити() метход враћа стуб који се може користити за позивање услуга. | _+_ |
  • И позовите метод прослеђујући потребне аргументе. Овде добијамо поздрав тако што проследимо име и одштампамо га. | _+_ |

Потпуни код клијента:

rm -rf target
mkdir target
javac -d target src/server/*.java

Регистар РМИ

Хајде сада да покренемо серверски програм тако да може да почне са сервирањем захтева.

jar cvf target/rmi-server.jar -C target server

Шта је овај изузетак ? конекција је одбијена .

Разлог зашто сте добили овај изузетак је тај што: приметите из кода сервера да покушава да се повеже са локалним регистром на порту 1099. Ако то не успе, завршићете са овим изузетком.

Решење је покретање РМИ регистра. Регистар РМИ је програм који се испоручује са Јава виртуелном машином и назива се рмирегистри . Требало би да се налази у сам директоријум инсталације Јава Виртуал Мацхине. Покретање је једноставно као:

jar cvf target/rmi-lib.jar -C target server/Greeting.class

Регистар подразумевано слуша на порту 1099. Да бисте га прислушкивали на другом порту, наведите број порта на следећи начин:

Registry registry = LocateRegistry.getRegistry(host, port);

Проверите да ли заиста постоји слушалац на наведеном порту са наредба нетстат :

како пребацити гоогле аутентификатор на нови телефон
Greeting greeting = (Greeting) registry.lookup(name);

Покретање сервера

Покушајмо сада поново да покренемо сервер.

System.out.println(name + ' reported: ' + greeting.greet(myName));

Опет изузетак! Шта је овај пут?

Сервер не може учитати класу интерфејса сервер.Поздрав . То се догађа зато што РМИ регистар не може учитати потребну класу. Зато морате навести локацију потребних класа. Један од начина да то учините је да наведете променљиву окружења ЦЛАССПАТХ:

package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Greeting;
public class Client
{
static public void main(String[] args) throws Exception
{
if ( args.length != 3 ) {
System.err.println('usage: java Client host port myName');
System.exit(1);
}
int index = 0;
String host = args[index++];
int port = Integer.parseInt(args[index++]);
String myName = args[index++];
String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(host, port);
Greeting greeting = (Greeting) registry.lookup(name);
System.out.println(name + ' reported: ' + greeting.greet(myName));
}
}

Покушај поновног покретања сервера даје:

java -cp target/rmi-server.jar server.Main 1099
# throws
Exception in thread 'main' java.rmi.ConnectException: Connection refused to host: xxx; nested exception is:
java.net.ConnectException: Connection refused

Сада сервер ради.

Покретање клијента

Након што су сви делови састављени и изведени, покретање клијента је једноставно. За извршавање су му потребни одговарајући ЈАР -ови. Ово укључује класу која садржи главни() метод и класа интерфејса. Прихвата аргументе који указују на то где је покренут РМИ регистар и назив поздрава.

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry

Резиме

Јава РМИ пружа АПИ и алате за лакше извршавање кода на даљину. Можете имплементирати сервер који региструје сервисни објекат у Јава РМИ регистру. Клијенти могу поставити упит регистру и добити стуб услужног објекта за позивање метода услуге. Као што овај пример илуструје, све је прилично једноставно.

Да ли користите Јава РМИ у свом пројекту? Какво је ваше искуство? Постоје ли алтернативе које сте истражили? Молимо вас да нас обавестите у коментарима испод.

Објави Објави Твеет Емаил Водич за почетнике у анимирању говора

Анимирање говора може бити изазов. Ако сте спремни за почетак додавања дијалога у ваш пројекат, ми ћемо вам разбити процес.

Прочитајте следеће
Повезане теме
  • Програмирање
  • Јава
О аутору Јаи Сридхар(17 објављених чланака) Више од Јаиа Сридхара

Претплатите се на наш билтен

Придружите се нашем билтену за техничке савете, критике, бесплатне е -књиге и ексклузивне понуде!

Кликните овде да бисте се претплатили