Запуск приложения Java RMI на двух машинах - ConnectException

1

Короче говоря - я пытаюсь запустить приложение RMI с клиентом и сервером на отдельных машинах с использованием Windows.

Упрощенный код на сервере:

System.setProperty("java.rmi.server.hostname", "192.168.x.x");  
Registry reg = LocateRegistry.createRegistry(1099);  
RemoteFoo foo = new RemoteFoo();        
reg.rebind("Foo", foo);  

У клиента у меня:

reg = LocateRegistry.getRegistry("192.168.x.x", 1099);
RemoteFooInterface foo = (RemoteFooInterface) reg.lookup("Foo");

Исключением, которое я получаю, является "Соединение отказалось от хоста: 192.168.xx; вложенное исключение - это время ожидания подключения: connect" в строке, где я просматриваю объект.

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

Теги:
rmi

1 ответ

2
Лучший ответ

Возможно, брандмауэр на сервере блокирует доступ.

Убедитесь, что вы можете подключиться к порту в вашем случае 1099. Например, с вашего клиентского компьютера откройте командную строку cmd.exe и введите telnet 192.168.xx 1099 (это будет подключение к порту 1099 на сервере). Если он говорит "Подключение к...", то этот порт недоступен, и очень вероятно, что клиентская машина не сможет связаться с сервером. Попробуйте выполнить ping 192.168.xx (он будет работать, если ICMP разрешен брандмауэром сервера).

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

  • 0
    Хорошо, я последовал твоему совету, и проблема была вызвана брандмауэром. Теперь у меня возникает проблема, когда клиент пытается привязать удаленный объект к этому реестру: reg.rebind (name, RemoteFoo); Причина привязки запрещена, поскольку реестр находится на удаленном хосте. Разве это не вся цель RMI - для приложений, которые не находятся на одной машине с реестром, чтобы иметь возможность использовать его? В любом случае, большое спасибо за вашу помощь!
  • 1
    Да, вы можете привязать объекты к реестру на сервере. Вы не можете дистанционное связывание, хотя. Удаленные объекты привязаны локально на серверном компьютере / процессе. Серверная часть запускается в 192.168.xx путем доступа к интерфейсу локальной сети (InetAddress.getLocalHost ()), а клиент запускается на другом процессе или компьютере. Вы не можете связывать объекты на другой виртуальной машине или другом процессе. Это запрещено. Вы должны использовать два разных процесса. Код на стороне сервера должен запускаться с компьютера 192.168.xx, а клиент может запускаться в любом месте сети (локально или удаленно), но только как процесс сравнения
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню