Мы используем связь 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 всегда ложно.
Я не знаю, достаточно ли это ясно. К сожалению !!!
У вас есть предложения?
Мои попытки:
Я попробовал это решение
- Запустите jvm с -Djava.rmi.server.hostname = аргумент localhost
- Переопределить RMIServerSocketFactory, чтобы он возвращал 127.0.0.1 каждый раз. (TCPEndpoint имеет 192.168.x.x ip и isLocal всегда false)
- Вызовите повторную привязку и поиск без хоста в URI. Это должно означать localhost.
но ни один из них не сработал.
Любые предложения приветствуются.