Какой порт используется соединением Java RMI?

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

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

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

Ответ 1

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

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

Ответ 2

В RMI в отношении портов есть два различных механизма:

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

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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)

Ответ 6

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

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

Ответ 7

Что касается других ответов выше, вот мое мнение -

есть порты, задействованные как на стороне клиента, так и на стороне сервера.

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

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

Ответ 8

Из javadoc java.rmi.registry.Registry

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

Подробнее в javadoc java.rmi.registry.LocateRegistry.

Ответ 9

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