Внутри удаленного заглушки вам необходимо установить новое значение для поля protected RemoteRef ref. Все удаленные коммуникации проходят через этот объект. Поскольку поле защищено, вы можете сделать это просто в своем собственном классе, который вы получаете из заглушки RMI.
К сожалению RemoteRef - это интерфейс без публичной реализации. Вы можете посмотреть существующие OpenJDK implementation. Оттуда видно, что существует реализация sun.rmi.server.UnicastRef
, для которой требуется LiveRef
, и для этого требуется Endpoint
. Endpoint
уже относительно легкий класс для понимания. Возможно, вам придется дублировать функциональность этих классов в вашем коде.
Чтобы убедиться, что класс заглушки действительно существует, сгенерируйте его с помощью rmic, возможно, даже используйте -keepgenerated
, чтобы вы могли проверить исходный код, которое это поле существует, - кто знает подробности конкретной реализации.
В общем, это не изящное и простое решение, но оно должно работать.
Extension: Как все это кажется довольно сложным сделать, я предлагаю вместо того, чтобы получить новый действующий окурок, который указывает на обновленном месте удаленного обслуживания и украсть значение ref
поля от него. Это кажется относительно простым в использовании и может быть разумным, если текущий заглушка запутан в некоторых структурах данных, так что вы не можете легко его заменить. Сама заглушка не заботится о хосте, порту, объекте id или watsoever, пока удаленная сторона продолжает реализовывать тот же самый удаленный контракт - только его RemoteRef
делает. Stub полагается на RemoteRef.invoke.
С какой целью? Получаемый в результате шлейф имеет только 1 из 65536 шансов на работу, даже если предположить, что удаленный объект, реализующий один и тот же удаленный интерфейс, был экспортирован через новый хост: порт. – EJP
привет, EJP Я получаю удаленный серверный объект. Затем я создаю клиента и регистрирую этого клиента. например server.register (клиент); в вышеприведенном случае, когда я пинговаю сервер, все идет правильно. Но когда я ping клиент с сервера, он не работает. Поскольку у клиента две карты Ethernet, а в клиентском объекте - недействительный адрес хоста. Таким образом, проверка неверного адреса хоста не выполняется. – emin