Какой порт используется подключением Java RMI? - PullRequest
16 голосов
/ 18 июня 2010

Могу ли я узнать, какой порт используется подключением Java RMI?

Если я хочу подключить клиентское приложение Java к серверному приложению Java с помощью соединения RMI, какой порт мне нужно открыть на сервере, чтобы клиентское приложение могло подключиться к нему?

Я хочу настроить брандмауэр на компьютере сервера, но я не знаю, какой порт мне следует открыть.

Ответы [ 9 ]

22 голосов
/ 18 июня 2010

RMI, как правило, не будет работать через брандмауэр, поскольку он использует непредсказуемые порты (он запускается 1099, а затем запускается со случайным портом).

В этих ситуациях вам обычно приходится прибегать к туннелированию RMI по HTTP, что хорошо описано здесь .

10 голосов
/ 13 февраля 2017

Все ответы пока неверны. Реестр обычно использует порт 1099, но вы можете изменить его. Но это не конец истории. Удаленные объекты также используют порты, и не обязательно 1099.

Если вы не указали порт при экспорте , RMI использует случайный порт. Поэтому решение указывает номер порта при экспорте . И это порт, который необходимо открыть в брандмауэре, если таковой имеется.

  • В случае, если ваш удаленный объект расширяется UnicastRemoteObject, вызовите его конструктор super(port) с некоторым ненулевым номером порта.

  • Если он не расширяется UnicastRemoteObject, укажите ненулевой номер порта для UnicastRemoteObject.exportObject().

Есть несколько морщин к этому.

  • Если вы не используете фабрики сокетов и указали ненулевой номер порта при экспорте вашего первого удаленного объекта, RMI автоматически поделится этим портом с последующими экспортированными удаленными объектами без указания номеров портов или указания нуля , Этот первый удаленный объект включает в себя реестр, созданный с помощью LocateRegistry.createRegistry().. Таким образом, если вы создадите Registry на порту 1099, все другие объекты, экспортируемые из этой JVM, могут использовать порт 1099.

  • Если вы используете фабрики сокетов, а ваша RMIServerSocketFactory имеет разумную реализацию equals(), то же самое применимо, как указано выше.

  • При обоих условиях вы можете использовать один и тот же ненулевой явный номер порта для всех удаленных объектов, например, createRegistry(1099), за которым следует любое количество super(1099) или exportObject(..., 1099) вызовов.

10 голосов
/ 18 июня 2010

В RMI, что касается портов, задействованы два различных механизма:

1) По умолчанию реестр RMI использует порт 1099

2) Клиент и сервер (заглушки, удаленные объекты).) взаимодействовать через случайные порты, если при экспорте удаленного объекта не был указан фиксированный порт.Связь начинается через фабрику сокетов, которая использует 0 в качестве начального порта, что означает «использовать любой доступный порт» между 0 и 65535.

3 голосов
/ 18 июня 2010

Обычно вы устанавливаете порт на сервере с помощью команды rmiregistry. Вы можете установить порт в командной строке, или он будет по умолчанию 1099

2 голосов
/ 11 апреля 2013

Если вы можете изменить клиент, распечатайте удаленную ссылку, и вы увидите, какой порт он использует. Э.Г.

ServerApi server = (ServerApi) registry.lookup(ServerApi.RMI_NAME);
System.out.println("Got server handle " + server);

будет производить что-то вроде:

Получил дескриптор сервера Proxy [ServerApi, RemoteObjectInvocationHandler [UnicastRef [liveRef: [конечная точка: 172.17.3.190: 9001, objID: [- 7c63fea8: ...

где вы можете видеть, что порт - 9001. Если удаленный класс не указывает порт, он будет меняться при перезагрузке. Если вы хотите использовать фиксированный порт, вам нужно убедиться, что конструктор удаленного класса делает что-то вроде:

super(rmiPort)
0 голосов
/ 09 октября 2017

Со ссылкой на другие ответы выше, вот мое мнение -

есть порты на стороне клиента и сервера.

  • для серверной / удаленной стороны, если вы экспортируете объект без указания порта, удаленный объект будет использовать произвольный порт для прослушивания.

  • клиент при поиске удаленного объекта всегда будет использовать случайный порт на своей стороне и будет подключаться к порту удаленного объекта, как указано выше.

0 голосов
/ 07 сентября 2016

Зависит от того, как вы реализуете RMI, вы можете установить порт реестра (реестр является «уникальной точкой сервисов»). Если вы не укажете явный порт, то реестр примет порт 1099 по умолчанию. В некоторых случаях у вас есть брандмауэр, и брандмауэр не позволяет вашему rmi-клиенту видеть заглушки и объекты за реестром, потому что все это работает случайным образом, через другой порт, который использует реестр, и этот порт заблокирован брандмауэром - конечно. Если вы используете RmiServiceExporter для настройки RmiServer, вы можете использовать метод rmiServiceExporter.setServicePort(port), чтобы исправить порт rmi и открыть этот порт в брандмауэре.

Редактировать: я решаю эту проблему с этим сообщением: http://www.mscharhag.com/java/java-rmi-things-to-remember

0 голосов
/ 16 ноября 2015

Порт доступен здесь: java.rmi.registry.Registry.REGISTRY_PORT (1099)

0 голосов
/ 19 февраля 2015

Из javadoc из java.rmi.registry.Registry

Следовательно, реализация удаленного объекта реестра обычно экспортируется с известным адресом, например с известным ObjID и номер порта TCP (по умолчанию 1099).

Подробнее см. В javadoc java.rmi.registry.LocateRegistry.

...