Какая-либо идея, почему я получаю RemoteException при попытке вызвать методы на машину Unix из Windows?
Я в сети и не думаю, что это из-за проблемы с брандмауэром, поскольку я могу сделать "telnet" от Windows до поля Unix после запуска сервера RMI в поле Unix. Я также не мог понять, почему это идет в локальный петлевой IP?
Отслеживание стека:
RemoteException occured, details java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
Заранее большое спасибо.
Вероятно, у вас неправильно настроено имя хоста на вашей Linux-машине. Готов поспорить, что если вы ping $(hostname)
с вашего Linux бокса, он будет ping 127.0.0.1
. Обычно это происходит из-за записи в файле /etc/hosts
.
Есть несколько способов решить эту проблему. Трудный способ заключается в том, чтобы заставить ваш Linux-компьютер правильно преобразовывать собственное имя хоста в IP-адрес. Вы можете отредактировать файл /etc/hosts
, настроить DNS-сервер, что угодно. Проблема в том, что хотя это может сделать все технически более корректным, вы рискуете сломать те вещи, которые полагались на старое поведение.
Путь наименьших изменений - установить системное свойство java.rmi.server.hostname
в имя хоста или IP-адрес вашей Linux-машины. (т.е. java -Djava.rmi.server.hostname=$(hostname) ...
).
Почему?
Сервер регистрации Java RMI на самом деле является сервером регистрации в сети. Объекты на других машинах могут связывать себя с этим реестром.
Когда удаленный объект регистрируется, регистрация включает в себя сетевой адрес как часть регистрации. По умолчанию используется "IP-адрес локального узла в формате "точка-четверка"". В вашей установке этот адрес - 127.0.0.1
.
Когда ваш блок Windows обращается к службе регистрации за адресом удаленного объекта, он получает ответ 127.0.0.1
. Затем он пытается связаться с удаленным объектом по этому адресу. Поэтому он обращается к адресу loopback.