Всичко за регистъра на Java RMI и как да го използвате

Всичко за регистъра на Java RMI и как да го използвате

RMI означава извикване на отдалечен метод и, както показва името, е протокол за Java програма за извикване на метод на обект, работещ на друг компютър. Той предоставя API (интерфейс за програмиране на приложения) за експортиране на обект от една програма (наречена сървър) и извикване на методите на този обект от друга програма (наречена клиент), евентуално работеща на друг компютър.





Java Регистър на RMI е ключов компонент на Java RMI системата и осигурява централизирана директория за сървъри за регистриране на услуги и за клиенти за търсене на тези услуги. В тази статия научаваме как да внедрим сървър за излагане на обект и клиент за извикване на метод на сървъра, както и регистриране и търсене на услугата в регистъра на RMI.





мога ли да променя името си на произход

Деклариране на сървърния интерфейс

За да научим тънкостите на това как работи Java RMI системата, нека внедрим прост сървърен обект, предоставящ метод за приемане на име и връщане на поздрав. Ето дефиницията на обектния интерфейс:





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

Извиква се името на интерфейса Поздрав . Той предоставя един метод, наречен поздрав () който приема име и връща подходящ поздрав.

За да маркирате този интерфейс като експортируем, той трябва да разшири java.rmi.Дистанционно интерфейс. Също така методът трябва да декларира a хвърля изброяване на клауза java.rmi.RemoteException в допълнение към всякакви специфични за приложението изключения. Това е така, че клиентският код може да обработва (или разпространява) грешки при извикване на отдалечен метод, като например хостът не е намерен , връзка-неуспех и т.н.



Реализиране на сървърния обект

След деклариране на интерфейса (който се използва от клиентите), ние реализираме обекта от страна на сървъра и предоставяме поздрав () метод, както е показано. Той използва прост формат низ за форматиране на поздрава.

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

Основният метод на сървъра

Нека сега съберем всички тези части заедно и да приложим main () метод на сървъра. Нека преминем през всяка от съответните стъпки.





  • Първата стъпка е да се създаде реализация на сървърния обект. | _+_ |
  • След това получаваме заглушка за сървърния обект от времето на изпълнение на RMI. Конусът реализира същия интерфейс като сървърния обект. Методът обаче осъществява необходимата комуникация с обекта на отдалечения сървър. Този клин се използва от клиента за прозрачно извикване на метода на сървърния обект. | _+_ |
  • След като клиентът бъде получен, ние го предаваме на регистъра на RMI, за да се свърже с определена именена услуга. Когато клиентът поиска внедряване на тази услуга, той получава конуса, който знае как да комуникира със сървърния обект. По -долу статичният метод LocateRegistry.getRegistry () се използва за получаване на справка за местния регистър. The rebind () след това се използва метод за свързване на името с мъничето. | _+_ |

Пълният основен метод.

Greeting greeting = new GreetingObject();

Изграждане на сървъра

Нека сега разгледаме изграждането на сървъра. За да опростим нещата, ние изграждаме с помощта на командния ред в Linux, вместо да използваме инструмент за изграждане като Maven.





Следното компилира изходните файлове в файлове на клас в целевата директория.

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

Съберете файловете на класа в JAR файл за изпълнение.

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

Ние също така събираме интерфейсните файлове, необходими за компилиране на клиента в библиотечен JAR.

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 + ''');
}
}

Прилагане на клиента

Нека сега разгледаме прилагането на клиента, използван за извикване на методите на сървърния обект.

  • Както при сървъра, получете препратка към системния регистър, като посочите името на хоста, където се изпълнява системният регистър, и номера на порта. | _+_ |
  • След това потърсете услугата в системния регистър. The погледни нагоре() метод връща пън, който може да се използва за извикване на услуги. | _+_ |
  • И извикайте метода, предавайки необходимите аргументи. Тук получаваме поздрава, като предаваме името и го отпечатваме. | _+_ |

Пълният клиентски код:

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

Регистърът на RMI

Нека сега стартираме сървърната програма, така че да може да започне да обслужва заявки.

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

Какво е това изключение ? връзката е отказана .

Причината да получите това изключение е, защото: отбележете от кода на сървъра, че той се опитва да се свърже с локалния регистър на порт 1099. Ако това не успее, в крайна сметка получавате това изключение.

Решението е да стартирате регистъра на RMI. Регистърът на RMI е програма, доставена с виртуалната машина Java и се нарича rmiregistry . Тя трябва да се намира в съм директория на инсталацията на Java Virtual Machine. Стартирането му е толкова просто, колкото:

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

По подразбиране регистърът слуша на порт 1099. За да го накарате да слуша на друг порт, посочете номера на порта, както следва:

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

Проверете дали наистина има слушател на посочения порт с командата netstat :

как да направите фона на картините прозрачен
Greeting greeting = (Greeting) registry.lookup(name);

Стартиране на сървъра

Нека сега се опитаме да стартираме сървъра отново.

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

Пак изключение! Какво е този път?

Сървърът не може да зареди интерфейсния клас сървър.Поздрав . Това се случва, защото регистърът на RMI не може да зареди необходимия клас. Така че трябва да посочите местоположението на необходимите класове. Един от начините да направите това е да посочите променливата на средата CLASSPATH:

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

Сега сървърът работи.

Стартиране на клиента

След като всички части са сглобени и изпълнени, стартирането на клиента е просто. За изпълнение се нуждае от подходящи JAR. Те включват класа, съдържащ main () метод и интерфейсен клас. Той приема аргументи, показващи къде се изпълнява регистърът на RMI, и име за поздрава.

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

Резюме

Java RMI предоставя API и инструменти за улесняване на отдалеченото изпълнение на код. Можете да внедрите сървър, който регистрира служебен обект в регистъра на Java RMI. Клиентите могат да отправят запитвания към системния регистър и да получат пътека на обект на услуга за извикване на методите за обслужване. Както илюстрира този пример, всичко е съвсем просто.

Използвате ли Java RMI във вашия проект? Какъв е вашият опит? Има ли алтернативи, които сте изследвали? Моля, уведомете ни в коментарите по -долу.

Дял Дял Туит електронна поща Ръководство за начинаещи по анимиране на речта

Анимирането на речта може да бъде предизвикателство. Ако сте готови да започнете да добавяте диалог към вашия проект, ние ще разбием процеса вместо вас.

Прочетете Напред
Свързани теми
  • Програмиране
  • Java
За автора Джей Шридхар(17 статии са публикувани) Още от Джей Шридхар

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате