зная номер порта во время RMI

Есть ли способ узнать номер порта как клиента, так и сервера во время RMI?

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

Например :

// call to a remote method add
     addServerIntf.add(d1,d2)
// after this call i get the added result

// again call the add method by again starting the client
    addServerIntf.add(d1,d2)
// I get the result back as usual

В двух разных вызовах остается ли номер порта клиента и сервера одинаковым?

Моя клиентская программа завершается после ввода такой команды, как java AddClient localhost 100 200. Метод на сервере возвращает 300, и клиент завершает работу. В следующий раз я снова запущу свой клиент с java AddClient localhost 19 100. Теперь запрос будет отправлен с того же порта, что и раньше, и сервер получит запрос на тот же порт? Или ситуация отличается от того, что я только что написал?


person Suhail Gupta    schedule 21.12.2011    source источник
comment
Я думаю, что ваш вопрос не очень ясен. Если вы привяжете удаленный объект к определенному порту, он будет доступен там и не переместится на другой порт. Не могли бы вы показать какой-нибудь код, который указывает на вашу проблему или уточнить ваш вопрос?   -  person mort    schedule 21.12.2011
comment
Порт сервера естественно не изменится. ОП говорит о порте клиента. Таким образом, вопрос заключается в том, устанавливают ли несколько вызовов RMI новое соединение с сервером (что приводит к другому клиентскому порту) или нет.   -  person f1sh    schedule 21.12.2011
comment
Я думаю, вы неправильно понимаете, как работают сокеты в целом. Как только конечная точка установлена, порт становится неактуальным.   -  person Chris Dennett    schedule 21.12.2011
comment
@ Крис Деннетт, позвольте мне сказать вам, что моя клиентская программа завершает работу после ввода такой команды, как java AddClient localhost 100 200. Метод на сервере возвращает 300, и клиент завершает работу. В следующий раз я снова запущу свой клиент с java AddClient localhost 19 100. Теперь запрос будет отправляться с того же порта, что и раньше, и будет ли сервер получать запрос на тот же порт? Или ситуация отличается от того, что я только что написал?   -  person Suhail Gupta    schedule 21.12.2011
comment
Поскольку программа завершается, я подозреваю, что клиентский сокет rmi также закрыт. Второй вызов вашей программы затем создаст новый клиентский сокет, который не гарантирует повторного использования того же порта, поскольку он контролируется ОС. Тем не менее, я понятия не имею, как получить экземпляры клиентских сокетов, чтобы просто вывести порты.   -  person f1sh    schedule 21.12.2011


Ответы (3)


Есть ли способ узнать номер порта как клиента, так и сервера?

Нет. Вы не можете знать номер порта клиента заранее, так как он выделяется динамически при подключении, а IP-адрес сервера: порт встроен в заглушку, где вы не можете его получить. Зачем тебе знать? Информация не может принести вам много пользы: вы не можете ее использовать.

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

Либо:

  • Клиентское соединение используется повторно с тем же номером порта или
  • На клиенте создается новое соединение, возможно, с новым локальным портом.

Невозможно сказать, какой. Порт сервера остается фиксированным.

В двух разных вызовах остается ли номер порта клиента и сервера одинаковым?

См. выше.

Моя клиентская программа закрывается после ввода такой команды, как java AddClient localhost 100 200. Метод на сервере возвращает 300, и клиент завершает работу. В следующий раз я снова запущу свой клиент с java AddClient localhost 19 100. Теперь запрос будет отправляться с того же порта, что и раньше

Возможно нет.

и будет ли сервер получать запрос на тот же порт?

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

Или ситуация отличается от того, что я только что написал?

Я не понимаю вопроса.

person user207421    schedule 23.12.2011
comment
@downvoter Пожалуйста, объясните. Необъяснимые отрицательные голоса никому не приносят пользы: ни постеру, ни ОП, ни сообществу. Если вы считаете, что в приведенном выше есть ошибка, пожалуйста, укажите. - person user207421; 24.12.2011
comment
Не могли бы вы объяснить, IP-адрес сервера: порт встроен в заглушку, где вы не можете получить к нему доступ... ! Я думаю, что LocateRegistry.getRegstry(int port_number); уже позволит клиенту узнать о номере порта сервера и/или IP-адресе. - person Am_I_Helpful; 24.08.2015
comment
@Am_I_Helpful Заглушка, возвращенная LocateRegistry.getRegistry(), является заглушкой Registry; это по-прежнему заглушка, непрозрачная для приложения; и он содержит номер порта, который вы предоставили ему в качестве параметра, который вы уже знали. Это не решение этого вопроса. NB. Понижение за то, что вы не отвечаете на комментарий, - это не то, как SO должен работать, IMO. - person user207421; 25.08.2015
comment
@EJB IP: порт встроен в заглушку, где вы не можете получить к нему доступ. -- если клиент распечатывает удаленный объект, полученный после поиска, IP-адрес и порт на стороне сервера будут отображаться в журнале. Иногда полезно при анализе захвата сетевых пакетов между приложением. - person Nrj; 09.10.2017
comment
@Nrj ОП запросил метод, а его нет. - person user207421; 31.01.2019

Есть ли способ узнать номер порта как клиента, так и сервера во время RMI?

Если я не ошибаюсь, я думаю, что невозможно узнать номер порта во время сеанса RMI.

Если у вас есть номер порта, отличный от порта 1099 сервера реестра RMI по умолчанию, вы должны установить его в классе сервера и в классе клиента, потому что, поскольку страница Oracle RMI сообщает:

Если реестр будет работать на порту, отличном от 1099, вам потребуется указать номер порта в вызовах LocateRegistry.getRegistry в классах Server и Client. Например, если в этом примере реестр работает на порту 2001, вызов getRegistry на сервере будет выглядеть так:

Registry registry = LocateRegistry.getRegistry(2001);

а также:

Этот клиент сначала получает заглушку для реестра, вызывая статический метод LocateRegistry.getRegistry с именем хоста, указанным в командной строке. Если имя хоста не указано, то в качестве имени хоста используется null, указывающий, что следует использовать локальный адрес хоста.

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

Просто подумайте: как вы можете получить этот номер порта? Связь с сервером или клиентом? Например, если вы запрашиваете страницу, расположенную на определенном Сервере, который прослушивает порт 81 (а не порт 80 по умолчанию), вам необходимо заранее указать номер порта для подключения к этому конкретному Серверу, связавшись с ним, например, по адресу: http://192.168.1.1:81. Затем во время сеанса RMI вы должны заранее знать порт реестра RMI.

Проверьте эту страницу для подробности.

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

Когда результат возвращается клиенту, обмен данными между Клиентом и Сервером должен осуществляться через один и тот же порт реестра RMI, в противном случае, если порт реестра RMI, установленный в клиенте, отличается от порта реестра RMI сервера (если я не забыл), код выдаст RemoteException, что может произойти при сбое в процессе RMI.

ОБНОВЛЕНИЕ

Теперь я вижу ваш обновленный вопрос.

В двух разных вызовах остается ли номер порта клиента и сервера одинаковым?

Это должен быть тот же порт сервера реестра RMI. Когда ваша программа завершает работу после первого вызова, она закрывает сокетное соединение. При следующем запуске программы порт реестра RMI должен быть таким же. В противном случае ваша программа должна выдать исключение, или при передаче аргументов программе вы получите неожиданный результат. Насколько я понял, ваша клиентская программа просто вызывает метод суммы на Сервере. После первого результата при следующем запуске программы вы получите другой результат? Если нет, я думаю, что порт реестра RMI такой же.

person Alberto Solano    schedule 21.12.2011
comment
Примечание модератора: комментарии под этим ответом были не чем иным, как спором о том, чей ответ правильный, и были удалены. Пожалуйста, оставляйте комментарии конструктивными и по теме, а также разумно голосуйте. - person BoltClock; 24.12.2011
comment
диалог между клиентом и сервером должен совместно использоваться на одном и том же порту реестра RMI, что неверно. Он может использоваться совместно через порт реестра при определенных условиях. - person user207421; 26.12.2014

Знайте свой TCP/IP: клиент подключается к серверу через определенный порт. Номер порта клиента является случайным (или он должен быть из соображений безопасности), номер порта сервера известен (в противном случае клиент вообще не смог бы подключиться).

Затем протокол TCP/IP установит соединение. Сервер создаст обработчик соединения и TCP/IP назначит этому соединению новый случайный порт. Номер порта на стороне сервера не меняется. Поскольку сервер может использовать IP+порт клиента в качестве ключа для различения различных «сеансов», любое количество клиентов может подключаться к одному и тому же порту сервера.

Это означает: после инициализации инфраструктуры RMI и клиент, и сервер будут взаимодействовать друг с другом через пару портов, которые не меняются, пока существует соединение.

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

моя клиентская программа завершает работу

Это означает, что соединение разорвано. При повторном запуске клиента создается новый клиентский порт. Скорее всего (с вероятностью 65534:65535, что примерно равно 1) будет новый номер порта.

Если вы снова запустите клиент в течение двух минут, номер портаs должен быть другим, потому что старые портыs остаются активными в течение двух минут, чтобы убедиться, что "удаленный TCP получил подтверждение запроса на завершение соединения" (если вы запустите netstat, вы увидите эти со статусом TIME_WAIT).

person Aaron Digulla    schedule 21.12.2011
comment
Совершенно неправильно. accept() создает новый сокет с IP:портом прослушивающего сокета в качестве локального адреса и IP:портом клиента в качестве целевого адреса. - person user207421; 23.12.2011
comment
ЭДП: Совершенно неверно. Как вы думаете, как новые клиенты могут подключаться, когда новый сокет блокирует порт прослушивания? И даже если я ошибусь в этой детали, остальная часть ответа все равно будет правильной. - person Aaron Digulla; 23.12.2011
comment
Пожалуйста, прочтите TCP RFC или проверьте вывод netstat, прежде чем повторять эту ошибку, и не отрицайте правильные ответы на темы, по которым вы дезинформированы. Весь ваш ответ состоит из вариаций этой ошибки: в ней нет «остального», что «было бы правильным». - person user207421; 24.12.2011
comment
Улучшил мой ответ информацией из Википедии и RFC. Думаю, я перепутал это с FTP, который открывает новые порты для передачи данных. PS: Говорить «Совершенно неверно» — не лучший способ исправить меня. Меня это бесило. - person Aaron Digulla; 27.12.2011
comment
Я не понимаю, какое отношение FTP, прикладной протокол, имеет к RMI, другому прикладному протоколу, или TCP, сеансовому протоколу. PS: наличие противоречий с правильными комментариями и отклонение правильных ответов также слегка раздражает ;-) - person user207421; 28.12.2011