RMI: определить IP-адрес удаленного объекта - PullRequest
4 голосов
/ 18 января 2012

У меня работает клиент-серверная система RMI.Информация о хосте сервера известна клиентам, поэтому они могут ее искать и совершать звонки.При первом обращении к серверу клиенты передают серверу удаленную ссылку «сами», чтобы сервер мог выполнять обратные вызовы.Сервер ведет список всех подключенных клиентов (когда клиент выключается, он «отменяет регистрацию» на сервере, и существует поток, который периодически проверяет, доступны ли клиенты, и высылает тех, которые не доступны).

На сервере имеется графический интерфейс (часть веб-приложения), который позволяет пользователям визуализировать подключенных клиентов в любое время.Теперь меня просят отобразить IP-адрес клиента в этом интерфейсе.

Мой вопрос: в RMI, если у вас есть удаленная ссылка на удаленный объект (заглушку), существует ли простой способ определитьхост (DNS-имя или IP-адрес), на котором этот удаленный объект фактически живет?

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

Ответы [ 2 ]

1 голос
/ 18 января 2012

RMISecurityManager и UnicastRemoteObject ничего об этом не говорят.
Вы можете использовать RemoteServer.getClientHost при подключении клиента.
Я не верю, что эту информацию можно получить, если она не передана в вызове удаленного метода.

0 голосов
/ 04 июня 2015

Примечание: Не используйте это, см. Комментарии.

У меня такое же требование, отображение IP-адреса клиентов в графическом интерфейсе. После отладки и анализа типов удаленного объекта и его подобъектов я получил следующий код:

  public static String getIpAddress(Object proxy) throws IllegalArgumentException, RemoteException, NotExpectedTypeException
  {
    InvocationHandler h = Proxy.getInvocationHandler(proxy);
    if (h instanceof RemoteObjectInvocationHandler)
    {
      RemoteRef remoteRef = ((RemoteObjectInvocationHandler) h).getRef();
      if (remoteRef instanceof UnicastRef)
      {
        Endpoint ep = ((UnicastRef) remoteRef).getLiveRef().getChannel().getEndpoint();
        if (ep instanceof TCPEndpoint) { return ((TCPEndpoint) ep).getHost(); }
        throw new NotExpectedTypeException(ep.getClass().getSimpleName(), "TCPEndpoint");
      }
      throw new NotExpectedTypeException(remoteRef.getClass().getSimpleName(), "UnicastRef");
    }
    throw new NotExpectedTypeException(h.getClass().getSimpleName(), "RemoteObjectInvocationHandler");
  }

, где NotExpectedTypeException является самоопределенным исключением.

Я не уверен, насколько надежен метод, так как он содержит много instanceof с. Однако я успешно проверил его в локальной сети, где я использовал TCP-соединения.

...