Java RMI Connect Exception: Соединение отказано в хосте / тайм-аут - PullRequest
9 голосов
/ 13 декабря 2011

Я работаю над игрой командной строки RMI, но всякий раз, когда я пытаюсь использовать Службу, я получаю сообщение об ошибке:

java.rmi.ConnectException: Connection refused to host: 192.168.56.1; nested exception is: 
    java.net.ConnectException: Connection timed out: connect

Это основной класс для моего Server:

public class RMIWar {

    public static void main(String[] args) throws RemoteException, MalformedURLException  {
        try {
            Controle obj = new Controle(4);
            Registry reg = LocateRegistry.createRegistry(1099);
            System.out.println("Server is ready");
            reg.rebind("CtrlServ", obj);
        }
        catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
    }
}

Основное для моего Client класса:

public class RMIWarClient {
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException  {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost");
            ControleInt ctrl = (ControleInt) registry.lookup("CtrlServ");
            System.out.println("CtrlServ found...\n");
            BioRMI bio = new BioRMI(null, 5,5,5);
            ctrl.thRegister("Test", bio.atk, bio.def, bio.agi);

        }

        catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
}

Есть предложения?

Ответы [ 4 ]

11 голосов
/ 13 декабря 2011

Проверьте, доступен ли ваш порт 1099 (это означает, что он заблокирован брандмауэром). Кроме того, вы не упомянули, какую ОС вы используете, и запускали ли вы реестр до запуска вашего сервера.

В этом руководстве по RMI поясняется:

Перед запуском вычислительного движка вам нужно запустить RMI реестр. Реестр RMI - это простое именование начальной загрузки на стороне сервера средство, которое позволяет удаленным клиентам получить ссылку на исходный удаленный объект.

По умолчанию реестр работает на порту 1099, как и ваш. Как говорится в руководстве, просто откройте командную строку (в Windows) или терминал оболочки (в UNIX-подобной ОС) и введите:

Для Windows (используйте javaw, если запуск недоступен):

start rmiregistry

ОС Solaris или Linux :

rmiregistry &

UPDATE

Я заметил, следуя руководству Oracle и моему проекту того времени, что в классе Server вы не экспортировали объект в среду выполнения RMI. Затем вы должны отредактировать эти строки:

Controle obj = new Controle(4);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", obj);

до:

Controle obj = new Controle(4);
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", stub);

Поскольку учебник сообщает:

Статический метод UnicastRemoteObject.exportObject экспортирует предоставленный удаленный объект, чтобы он мог получать вызовы его удаленные методы от удаленных клиентов.

Кроме того, если вы используете тот же хост для вызова RMI, он не нужен в классе Client:

Registry registry = LocateRegistry.getRegistry("localhost");

Просто вызовите:

Registry registry = LocateRegistry.getRegistry();

Поскольку Oracle сообщает:

Перегрузка без аргументов LocateRegistry.getRegistry синтезирует ссылка на реестр на локальном хосте и в реестре по умолчанию порт, 1099. Вы должны использовать перегрузку с параметром int, если реестр создается на порту, отличном от 1099.

0 голосов
/ 06 марта 2014

Я описал свое решение здесь java.rmi.ConnectException: соединение отказано в хосте: 127.0.1.1; и здесь Невозможно подключиться к MBeanServer Tomcat через jconsole в Java6 . проблема была основной сетевой проблемой, но она может случиться с кем-то еще.

0 голосов
/ 14 декабря 2011

Я не понимаю, как вы можете получить это исключение из этого кода.В соответствии с кодом, ваш сервер и клиент работают на одном хосте, и вы не получаете тайм-ауты соединения на одном хосте.

Итак, предположим, что это не ваш реальный код, и вы ищете правильный реестр (аргумент host для getRegistry()), я бы спросил, является ли 192.168.56.1 IP-адресом, который вы ожидаете увидеть с учетом топологии вашей сети.Это внутренний адрес локальной сети, и если ваш клиент находится за пределами локальной сети, он должен пытаться подключиться к более общедоступному IP-адресу.Если адрес не тот, который вы ожидаете, я отсылаю вас к пункт A.1 в FAQ RMI .

0 голосов
/ 13 декабря 2011

Будьте осторожны с портами, потому что они могут быть заблокированы для брандмауэра, например, если вы работаете в защищенной области, например, на работе или в университете, администратор мог бы внедрить некоторые средства защиты ...

...