Почему клиент RMI localhost использует ip no localhost для подключения к серверу RMI localhost - PullRequest
6 голосов
/ 23 ноября 2010

Мы используем связь RMI клиент / сервер на одном и том же компьютере (поэтому все ip должны быть локальными).

Запускаем реестр (по умолчанию используется порт 1099)

registry = LocateRegistry.createRegistry(port);

и экспортировать некоторые объекты в реестр RMI

Naming.rebind("//" + "localhost" + ":" + port + "/" + name, object);

Из другого процесса мы извлекаем некоторые объекты (помните, что все выполняется в localhost)

MyRemoteObject ro = (MyRemoteObject) Naming.lookup("//" + "localhost" + ":" + port + "/" + name);

Проблема возникает, когда вы запускаете приложение, начиная с работающей локальной сети и в середине процесса вы отключаете сетевое соединение. Если вы запускаете приложение, и локальная сеть работает без всплывающих окон, а если вы запускаете приложение и локальная сеть не работает, всплывающих окон нет. Это происходит, когда вы меняете локальную сеть во время работы приложения.

Вот исключение, которое выдается при выполнении метода Naming.lookup ():

java.lang.RuntimeException: java.rmi.ConnectIOException: Exception creating connection to: 192.168.x.x; nested exception is: java.net.NoRouteToHostException: No route to host: connect

Немного отладив, я обнаружил, что

RemoteObject ($ Proxy0) -> RemoteObjectInvocationHandler -> UnicastRef2 -> LiveRef -> TCPEndpoint

У

был ip хоста (например, 192.168.x.x) вместо «localhost» или 127.0.0.1 (что бы я хотел). И логическое значение isLocal объекта liveRef всегда ложно.

Я не знаю, достаточно ли это ясно. К сожалению !!!

У вас есть предложения?

Мои попытки:

Я попробовал это решение

  1. Запустите jvm с -Djava.rmi.server.hostname = аргумент localhost
  2. Переопределить RMIServerSocketFactory, чтобы он возвращал 127.0.0.1 каждый раз. (TCPEndpoint имеет 192.168.x.x ip и isLocal всегда false)
  3. Вызовите повторную привязку и поиск без хоста в URI. Это должно означать localhost.

но ни один из них не сработал.

Любые предложения приветствуются.

Ответы [ 3 ]

5 голосов
/ 23 ноября 2010

java.rmi.server.hostname должен сделать трюк .Вы установили его на сервере, верно?

Если java.rmi.server.hostname=localhost не работает, как насчет java.rmi.server.hostname=127.0.0.1 или java.rmi.server.hostname=::1?

0 голосов
/ 24 ноября 2010

Извините, ребята.Моя ошибка.

Как вы указали, я устанавливал аргумент "java.rmi.server.hostname = localhost" для клиентских процессов.Он работал как шарм, когда я установил аргумент для процесса, который запускает RMI-сервер.

Большое спасибо.

0 голосов
/ 23 ноября 2010

Вы можете попытаться запустить свой сервер с этим набором свойств -Djava.rmi.server.hostname=localhost

См. Также Раздел 3.5.4

Это потому, что сервер привязывается к интерфейсу,127.0.0.1 или 192.168.xx

...