Получить правильный локальный IP-адрес из Java-апплета - PullRequest
9 голосов
/ 02 октября 2009

Я хотел бы определить локальный IP-адрес из моего Java-апплета. Проблема в том, что на одном компьютере есть несколько IP-адресов, на которых есть подключение к локальной сети и Интернет. (ладонь, VMWare ...).

Вот мой тест:

    public static void main(String[] args) {
      try {
        String hostName = InetAddress.getLocalHost().getHostName();
        System.out.println("HostName = " + hostName);
        System.out.println("HostAddressLocal = " +
          InetAddress.getLocalHost().getHostAddress());
        InetAddress[] inetAddresses = InetAddress.getAllByName(hostName);
        for (InetAddress inetAddress : inetAddresses) {
          System.out.println("hostAddress = " + inetAddress.getHostAddress());
        }
      } catch (Exception e) {
          e.printStackTrace();
      }
    }

Результат:

    HostName = xxxx
    HostAddressLocal = xx.xx.xx.xx
    hostAddress = 10.10.11.51
    hostAddress = 192.168.23.1
    hostAddress = 192.168.106.1

где xx.xx.xx.xx не правильный адрес. Правильным является 10.10.11.51.


РЕДАКТИРОВАТЬ в ответ на jarnbjo :

Твой хрустальный шар говорит правду. Вы поняли мою проблему. Клиент может подключиться через прокси, поэтому я не могу использовать ваш первый пункт. Если я выполню этот код ниже на моем компьютере:

    Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

У меня есть такой результат:

    Internet IP = /127.0.0.1 

а не 10.10.11.51

Ответы [ 2 ]

11 голосов
/ 02 октября 2009

Как вы уже обнаружили, у компьютера вполне может быть несколько сетевых интерфейсов с разными IP-адресами, и немного сложно угадать, какой из них вы считаете "правильным", поскольку все они на самом деле правильные. *

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

  • На сервере вы можете встроить апплет в динамически генерируемую HTML-страницу и добавить IP-адрес клиента в качестве параметра апплета. По крайней мере, если вы не используете HTTP через прокси, веб-сервер должен иметь возможность определить IP-адрес клиента и передать его апплету.

  • В апплете вы можете открыть сокет TCP для веб-сервера, с которого вы загрузили апплет, и проверить, какой локальный адрес используется для соединения:

.

Socket s = new Socket("www", 80);
InetAddress ip = s.getLocalAddress();
s.close();
0 голосов
/ 02 октября 2009

В нижней части getHostName () C функция gethostbyname (). Они сначала ищут / etc / hosts, затем пытаются разрешить через DNS. Таким образом, если вы добавите 10.10.11.51 myhostname в / etc / hosts, getHostName () должен правильно его определить В Windows есть аналог / etc / hosts, AFAIR в \ WINDOWS \ System32 \ Servises или около того ...

Это ТОЛЬКО проблема разрешения имен.

В вашем коде вы сначала получаете имя хоста (hostName = InetAddress.getLocalHost (). GetHostName ();) эта функция возвращает имя вашего компьютера, установленное при установке системы. Затем вы получаете все IP конкретного имени хоста (InetAddress.getAllByName (hostName)) - это возвращает все IP, разрешенные для этого имени хоста

Простой пример

1 / etc / hosts, как это

127.0.0.1   localhost
127.0.1.1   fred-desktop

ваш код возврата

HostName = fred-desktop
HostAddressLocal = 127.0.1.1
hostAddress = 127.0.1.1

2 измените / etc / hosts на

127.0.0.1   localhost
127.0.1.1   fred-desktop
192.168.1.1 fred-desktop
20.20.20.20 fred-desktop

ваш код вернется

HostName = fred-desktop
HostAddressLocal = 127.0.1.1
hostAddress = 127.0.1.1
hostAddress = 192.168.1.1
hostAddress = 20.20.20.20

fred-desktop - имя моей коробки с Ubuntu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...