#java #rmi
#java #rmi
Вопрос:
RMI exportObject(Remote obj, PORT);
createRegistry(PORT);
Они могут использовать один и тот же порт, и он работает должным образом. Но всякий раз, когда я пытаюсь указать ip addr для любого из них, расширяя RMISocketFactory, он будет сообщать "port already in use"
.
createRegistry(PORT,ssf,csf);
Если они могут использовать один и тот же порт на localhost, почему определенный ip не работает?
Ответ №1:
Это не работает, потому что они могут использовать один и тот же порт, только если они используют один и тот же RMIServerSocketFactory , под которым я подразумеваю, что метод equals() этой фабрики сокетов возвращает true при вызове с другим экземпляром или сам по себе, если вы используете только один экземпляр.
Итак:
-
Не расширяйте RMISocketFactory, он устарел. Создайте свой собственный класс, который реализует RMIServerSocketFactory, и убедитесь, что его метод equals() соответствует самому себе.
-
Используйте эту фабрику серверных сокетов как в exportObject(), так и в createRegistry().
Но я бы задался вопросом, почему вы вообще привязываетесь к определенному IP-адресу. Обычно это ошибка и часто неправильное решение другой проблемы, например, проблемы с java.rmi.server.hostname.
Комментарии:
1. a) Спасибо за ваш ответ. Я реализовал «InetAddressBoundSocketFactory расширяет RMISocketFactory реализует Serializable { createServerSocket;createSocket; }». По пункту 1 я предполагаю, что вы советуете мне также реализовать «equal()».
2. б) Моя цель — запустить несколько приложений на нескольких сетевых адаптерах, по одному IP для каждого экземпляра. Я уже установил java.rmi.server.hostname в IP-адрес, к которому я пытаюсь привязаться, означает ли это, что привязка к определенному IP-адресу разрешена?
3. (A) Мой пункт 1 кажется мне совершенно ясным, и он не совпадает с вашим предположением. Попробуйте еще раз. NB Реализации RMIServerSocketFactory не обязательно должны быть сериализуемыми. (B) я не понимаю вашего вопроса.