зная номер порта во время RMI - PullRequest
4 голосов
/ 21 декабря 2011

Есть ли способ узнать номер порта как клиента, так и сервера во время 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. Теперь будет ли запрос отправляться с того же порта, с которого он был отправлен ранее, и получит ли сервер запрос на тот же порт? Или ситуация отличается от того, что я только что написал?

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

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

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

Если номер порта отличается от порта сервера 1099 реестра RMI по умолчанию, его необходимо установить для класса Server и класса Client, поскольку в качестве Страница Oracle RMI отчеты:

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

Registry registry = LocateRegistry.getRegistry(2001);

и:

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

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

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

Подробнее см. На этой странице .

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

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

ОБНОВЛЕНИЕ

СейчасЯ вижу ваш обновленный вопрос.

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

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

2 голосов
/ 23 декабря 2011

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

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

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

Или:

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

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

В 2 разных звонках номер порта клиента и сервера остаться прежним?

См. Выше.

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

Вероятно, нет.

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

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

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

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

0 голосов
/ 21 декабря 2011

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

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

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

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

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

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

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

...