Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 12

Запуск java rmi системы

18.04.2017, 01:23. Показов 5977. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет) Только разбираюсь с rmi и решила запустить простой пример с выводом "Hello World". Но у меня не получается. Опишу все подробно, может кто поможет. Сразу скажу, что сами классы я в пакет не помещала, так легче в консоли потом переходить в папки. Но знаю, что так делать плохо.

Интерфейс:

Java
1
2
3
4
5
6
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface Hello extends Remote {
    String sayHello() throws RemoteException;
}
Сервер:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
 
public class Server implements Hello {
 
    public Server() {}
 
    public String sayHello() {
        return "Hello, world!";
    }
 
    public static void main(String args[]) {
 
        try {
            Server obj = new Server();
            Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
 
            // Bind the remote object's stub in the registry
            Registry registry = LocateRegistry.getRegistry();
            registry.bind("Hello", stub);
 
            System.err.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
Клиент:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
 
public class Client {
 
    private Client() {}
 
    public static void main(String[] args) {
 
        String host = (args.length < 1) ? null : args[0];
        try {
            Registry registry = LocateRegistry.getRegistry(host);
            Hello stub = (Hello) registry.lookup("Hello");
            String response = stub.sayHello();
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
Итак.
1. Нужно скомпилировать все классы
2. Запустить реестр Java RMI
3. Запустить Server
4. Запустить Client

1. Начинаем с компиляции. Мой проект лежит на диске D: и называется Hello. Запуская командную строку и перехожу в папку src моего проекта (cd /d d:Hello\src). Перешла, теперь нужно скомпилировать. На сайте oracle приведена следующая команда для этого: javac -d destDir Hello.java Server.java Client.java.
Ввожу - ошибка:
javac: directory not found: destDir
Usage: javac <options> <source files>
use -help for a list of possible options

Поэтому я компилирую просто вот так: javac *.java. Итог - в папке src появляются файлы с расширением .class. Т.е. все сделано правильно.

2. Нужно запустите реестр Java RMI. В этой же консоли ввожу start rmiregistry. В итоге открывается консоль, в верху которой прописан следующий путь: C:\Program Files\Java\jdk1.8.0_121\bin\rmiregistry. exe. Я так понимаю, что здесь тоже все правильно. Если нет, то исправьте, пожалуйста.

3. Запуск сервера. В новой консоли перехожу в src и ввожу start java -classpath classDir -Djava.rmi.server.codebase=file:classDir/ Server (взято с сайта oracle). Открывается на несколько секунд другая консоль и закрывается. В той консоли, что я ввела команду для запуска сервера ничего не происходит, хотя должно писать Server ready. Пробую еще раз в этой же консоли ввести уже другую команду: просто java Server.
Выдает ошибку:
Error: Main method not found in class Server, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
Пробую здесь по-другому: start java -classpath classDir Server. Результат такой же, как и при вводе start java -classpath classDir -Djava.rmi.server.codebase=file:classDir/ Server: открывается на несколько секунд другая консоль и закрывается.

4. Запуск клиента. В новой консоли переходу в src проекта и ввожу java -classpath classDir Client.
Выводит ошибку: Error: Could not find or load main class Client.
Ввожу java Client и тоже ошибка:
Error: Main method not found in class Client, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Почему-то у меня не получается запустить сервер и клиент. Наверное, я делаю какие-нибудь очень глупые ошибки, но я только начала изучать) и хочу разобраться.

Кстати, если я меняю код сервера (изменения выделено жирным):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
 
public class Server implements Hello {
 
    public Server() {}
 
    public String sayHello() {
        return "Hello, world!";
    }
 
    public static void main(String args[]) {
 
        try {
            Server obj = new Server();
            Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
 
            // Bind the remote object's stub in the registry
            [B]Registry registry = LocateRegistry.createRegistry(1098);[/B]
            registry.bind("Hello", stub);
 
            System.err.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
и компилирую файлы через javac *.java, запускаю реестр в этой же консоли start rmiregistry, в новой консоли запускаю сервер java Server, то все работает и выводится Server ready, но когда я запуская в новой консоли клиента java Client, то выдает ошибку:

Client exception: java.rmi.NotBoundException: Hello
java.rmi.NotBoundException: Hello
at sun.rmi.registry.RegistryImpl.lookup(Reg istryImpl.java:209)
at sun.rmi.registry.RegistryImpl_Skel.dispa tch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispa tch(UnicastServerRef.java:450)
at sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transp ort.java:200)
at sun.rmi.transport.Transport$1.run(Transp ort.java:197)
at java.security.AccessController.doPrivile ged(Native Method)
at sun.rmi.transport.Transport.serviceCall( Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handl eMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$Conne ctionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$Conne ctionHandler.lambda$run$0(TCPTransport.j ava:683)
at java.security.AccessController.doPrivile ged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$Conne ctionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor. runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at sun.rmi.transport.StreamRemoteCall.excep tionReceivedFromServer(StreamRemoteCall. java:276)
at sun.rmi.transport.StreamRemoteCall.execu teCall(StreamRemoteCall.java:253)
at sun.rmi.server.UnicastRef.invoke(Unicast Ref.java:379)
at sun.rmi.registry.RegistryImpl_Stub.looku p(Unknown Source)
at Client.main(Client.java:13)

Естественно, я переходила в папку src каждый раз.
Не понимаю, что не так. Может проблема в переменной среды, но я в этом плохо разбираюсь. Может у кого было что-то подобное вначале изучения и Вы мне сможете помочь. Буду очень признательна)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2017, 01:23
Ответы с готовыми решениями:

Ошибка в RMI: nested exception is: java.lang.ClassNotFoundException: rmi.RemoteDateImpl_Stub
Пытаюсь создать простое RMI приложение , а точнее беру пример из книги сервер выглядить так когда его запускаю из JBuilder то...

Java RMI
Клиент удаленно вызывает метод сервера, который может быть запущен на удаленном компьютере. На клиенте водится строка. Сервер возвращает...

JAVA RMI калькулятор
Вот код того, что нормально функционирует, для общей картины, может комуто будет полезным. public class Fraction_RMI_Definitions { ...

2
0 / 0 / 1
Регистрация: 18.04.2017
Сообщений: 2
18.04.2017, 15:11
Java
1
Registry registry = LocateRegistry.createRegistry(1098);
Этот код создает RMI реестр программно. И в таком случае не нужно вручную его стартовать через консоль.
В клиенте помимо хоста постарайтесь явно указывать порт, который прописали в Сервере.
Переменная host в клиентском коде у вас какое значение принимает?
0
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 12
18.04.2017, 16:00  [ТС]
Я для клиента прописала Registry registry = LocateRegistry.getRegistry(1098);и все получилось! Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2017, 16:00
Помогаю со студенческими работами здесь

Как исправить ошибку java.rmi.ServerException
Использую в своем проекте проект который использует RMI, с RMI не сильно знаком , вылетает такой експешион java.rmi.ServerException:...

Запуск java из консоли
Здравствуйте. Есть класс: public class qqq { public static void main(String args) { System.out.println(&quot;Hi&quot;); ...

Запуск Java приложений
Доброго времени суток! Возник такой вопрос: А какие способы есть для запуска Java приложений? Вот например для C/C++ и тому подобное...

Запуск java приложения
подскажите как запустить java приложение с интерфейсом как exe программу , код пишу в нетбин

Запуск java через прокси
Как запустить java программу через прокси на пк. Запуск идет из bat файла. Что там нужно прописать?Заранее благодарю


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru