powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Клиент не видит RMI-объект
9 сообщений из 9, страница 1 из 1
Клиент не видит RMI-объект
    #39120288
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разбираю простой пример rmi (калькулятор).
1. Создаю в нетбизне проект rmi_calc_test
Создаем:
интерфейс калькулятора:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
package rmi_calc_test;

public interface Calculator extends java.rmi.Remote {
    public long add(long a, long b)
        throws java.rmi.RemoteException;

    public long sub(long a, long b)
        throws java.rmi.RemoteException;

    public long mul(long a, long b)
        throws java.rmi.RemoteException;

    public long div(long a, long b)
        throws java.rmi.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.
package rmi_calc_test;

public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator {

    public CalculatorImpl() throws java.rmi.RemoteException {
        super();
    }

    public long add(long a, long b) throws java.rmi.RemoteException {
        return a + b;
    }

    public long sub(long a, long b) throws java.rmi.RemoteException {
        return a - b;
    }

    public long mul(long a, long b) throws java.rmi.RemoteException {
        return a * b;
    }

    public long div(long a, long b) throws java.rmi.RemoteException {
        return a / b;
    }
}


регистрация сервися в rmi и привязка его к Calculator-у (вроде как):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class CalculatorServer {    
    public CalculatorServer() { 
    }

    public static void main(String[] args) { 
        try { 
            int port = 1099; 
            Registry r = LocateRegistry.createRegistry(port); 
            Calculator calc = new CalculatorImpl();
            r.rebind("rmi://localhost:" + port + "/CalculatorService", calc); 
            System.out.println("bind complite."); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    }
}



2. Запускаем.
Вывод: bind complite.
(типа что-то зашуршало, но не уверен)

3. Создаем в этом же нетбинзе проект клиентского приложения (CalculatorServer все еще шуршит вроде как):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
package calculatorclient;

import java.rmi.Naming;

public class CalculatorClient {

    public static void main(String[] args) {
        try {
            Calculator c = (Calculator) Naming.lookup("rmi://localhost:1099/CalculatorService");
            System.out.println( c.sub(8, 2) );
            System.out.println( c.add(4, 5) );
            System.out.println( c.mul(6, 7) );
            System.out.println( c.div(8, 2) );
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}



Так вот не видит проект клиента Calculator, ну и не компилируется.
Одни пишут про создание заглушек с помощью rmic (немного попробовал, пока не очень вышло),
другие пишут, что заглушки не нужны, запускаешь сервер и усе (видимо, сервис регается в rmi и все должно быть видно в других проектах?) В общем, что не так? )
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39120307
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Код: java
1.
2.
3.
4.
package calculatorclient;

import rmi_calc_test.Calculator;
import java.rmi.Naming;
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39120325
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD , возможно, но не похоже или туплю:
Откуда удаленные клиенты могут знать, что надо импортировать, т.е. в каком пакете реализован класс для rmi?
Или это сообщается в обязательном порядке?
В любом случае:
Добавил
Код: java
1.
import rmi_calc_test.Calculator;


Теперь не видит rmi_calc_test, не будем же мы тянуть на каждый клиент этот пакет как есть, тогда смысл rmi.
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39120343
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо 3 проекта - калькулятор-интерфейс, калькулятор-реализация-интерфейса-сервер, калькулятор-клиент, оба последних зависят от первого. Смысл - быстрее, но при изменении интерфейса надо перекомпилировать слишком много всего. Поэтому неудобно и лучше использовать что-то другое.
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39120350
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Клиент же должен знать интерфейс сервиса, надо тянуть, он не должен знать как реализован он. В нетбинс кажется можно так library -> add project -> rmi_calc_test
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39120371
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD , точно, туплю! )) На то ж он и интерфейс ) Добавил, заработало, спасиб.
no56892, ну пока обошелся двумя вроде, выносить интерфейс в отдельный проект? Полезно?
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39120744
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наваял более реальный пример.
Вроде все компилится, но при выполнении падает на строке, как если бы CalculatorServer-е падал на строке:
Код: java
1.
Calculator calc = new CalculatorImpl();


С ошибкой:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
   ...........


Т.е. пачимута не может загрузить класс-реализующий интерфейс. Хотя визуально вроде все нормально.
Может какие-то ограничения на класс реализации накладываются?
Интерфейс публичный, один публичный метод в нем, класс реализации объявлен как
Код: java
1.
public class myclassimpl extends java.rmi.server.UnicastRemoteObject implements myclass {...


в этом классе тоже один публичный метод с throws java.rmi.RemoteException, кот. возвращает строку,
конструктор, ну и кучка приватных методов, все точно так же как в простом примере с калькулятором, но что-то не так.
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39122161
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не выходит каменный цветок.
Упростил уже дальше некуда
Интерфейс:
Код: java
1.
2.
3.
public interface TestInteface extends java.rmi.Remote {
    public String runT(String requestType) throws java.rmi.RemoteException;
}


Реализация:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class TestIntefaceimpl extends java.rmi.server.UnicastRemoteObject implements TestInteface{
    
    public TestIntefaceimpl () throws java.rmi.RemoteException {
        super();
    }

    public String runT(String requestType) 
                      throws java.rmi.RemoteException {
        return "";
    }
}


При попытке инициализировать интерфейс в классе, который регистрирует удаленный интерфейс:
Код: java
1.
2.
3.
4.
5.
6.
....
        Registry registry = LocateRegistry.createRegistry(2099);
        TestInteface testInteface = new TestIntefaceimpl();
	registry.rebind("TestService", testInteface);
        System.out.println("Service started.");
....


Падает на выделенной строке:
Код: java
1.
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class


При этом уже рядом создал два тестовых примера, которые работают, а этот все никак.
Если что, попробую мигрировать нужный код в рабочие тестовые примеры, но интересно понять, что не так.
...
Рейтинг: 0 / 0
Клиент не видит RMI-объект
    #39122849
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что, попробую мигрировать нужный код в рабочие тестовые примеры
В общем пока так и сделал, работает, что было не так не разобрался, нет времени к сож.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Клиент не видит RMI-объект
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]