IP-адрес не получен в Java - PullRequest
20 голосов
/ 30 июня 2009

Этот код раньше возвращал мой локальный IP-адрес как 192.xxx.x.xxx, но теперь он возвращает 127.0.0.1. Пожалуйста, помогите мне, почему один и тот же код возвращает другое значение. Есть ли что-то, что мне нужно смотреть на ОС Linux.

import java.util.*;
import java.lang.*;
import java.net.*;

public class GetOwnIP
{
  public static void main(String args[]) {
    try{
      InetAddress ownIP=InetAddress.getLocalHost();
      System.out.println("IP of my system is := "+ownIP.getHostAddress());
    }catch (Exception e){
      System.out.println("Exception caught ="+e.getMessage());
    }
  }
}

Ответы [ 5 ]

30 голосов
/ 30 июня 2009

127.0.0.1 - это петлевой адаптер - это совершенно правильный ответ на (несколько неправильный) вопрос «какой у меня IP-адрес?»

Проблема в том, что несколько правильных ответов на этот вопрос.

РЕДАКТИРОВАТЬ: документы для getLocalHost сказать:

Если есть менеджер безопасности, его Метод checkConnect вызывается с имя локального хоста и -1 как его аргументы, чтобы увидеть, если операция позволил. Если операция не разрешено, InetAddress представляет адрес обратной связи возвращается.

Возможно ли, что изменение в поведении связано с изменением разрешений?

РЕДАКТИРОВАТЬ: Я считаю, что NetworkInterface.getNetworkInterfaces это то, что вам нужно перечислить все возможности. Вот пример, который не показывает виртуальные адреса, но работает для «основных» интерфейсов:

import java.net.*;
import java.util.*;

public class Test
{
    public static void main(String[] args)
        throws Exception // Just for simplicity
    {
        for (Enumeration<NetworkInterface> ifaces = 
               NetworkInterface.getNetworkInterfaces();
             ifaces.hasMoreElements(); )
        {
            NetworkInterface iface = ifaces.nextElement();
            System.out.println(iface.getName() + ":");
            for (Enumeration<InetAddress> addresses =
                   iface.getInetAddresses();
                 addresses.hasMoreElements(); )
            {
                InetAddress address = addresses.nextElement();
                System.out.println("  " + address);
            }
        }
    }
}

(Я забыл, насколько ужасно работать с типом Enumeration<T> напрямую!)

Вот результаты на моем ноутбуке прямо сейчас:

lo:
  /127.0.0.1
eth0:
  /169.254.148.66
eth1:
eth2:
ppp0:
  /10.54.251.111

(я не думаю, что это выдаёт чрезвычайно конфиденциальную информацию:)

Если вы знаете, какой сетевой интерфейс вы хотите использовать, позвоните по номеру NetworkInterface.getByName(...) и посмотрите на адреса этого интерфейса (как показано в коде выше).

6 голосов
/ 30 июня 2009

Когда вы используете InetAddress.getLocalHost (), вы не гарантированно получите конкретный интерфейс, т.е. Вы можете получить интерфейс loopback (127) или подключенный.

Чтобы вы всегда получали внешний интерфейс, вы должны использовать класс java.net.NetworkInterface. Статический класс getByName (String) предоставит вам интерфейс с определенным именем (например, «eth0»). Затем вы можете использовать функцию getInetAddresses () для получения IP-адресов (может быть только один), связанных с этим интерфейсом.

NetworkInterface ni = NetworkInterface.getByName("eth1");
ni.getInetAddresses();
2 голосов
/ 30 июня 2009

Проверьте файл / etc / host. Если сначала поставить 127.0.0.1, он вернет это как результат.

Правильный способ получить IP-адрес - использовать NetworkInterface.getNetworkInterfaces() и запускать getInetAddresses() для каждого из них.

0 голосов
/ 30 июня 2009

Вы можете использовать метод NetworkInterface.getNetworkInterfaces() для получения Enumeration всех сетевых интерфейсов для вашей системы.

Для каждого из экземпляров NetworkInterface вы можете затем использовать метод getInetAddresses() для получения Enumeration всех экземпляров InetAddress, связанных с сетевым интерфейсом.

Наконец, вы можете использовать метод getHostAddress() в каждом экземпляре InetAddress для получения IP-адреса в текстовом виде.

0 голосов
/ 30 июня 2009

Это потому, что у вас есть строка в / etc / hosts вроде 127.0.0.1 localhost тебе нужно иметь 192.xxx.xxx.xxx localhost

Хотя учтите, что это было бы очень плохо, поскольку для решения проблемы с кодом вам не следует изменять файлы конфигурации linux. Мало того, что это не правильно (и рискует сломать некоторые другие сетевые приложения на вашем Linux-боксе), оно также не будет работать где-либо еще (если администраторы этих блоков также не единомышленники).

javadoc для InetAddress.getLocalHost (); читать ".... возвращается InetAddress, представляющий адрес обратной связи." так что кажется, что реализация getLocalHost () неверна на ваших UNIX и WIN коробках. Адрес обратной связи почти всегда 127.0.0.1

Нашел этот комментарий «У хоста может быть несколько IP-адресов, и другим хостам, возможно, придется использовать разные адреса, чтобы достичь его. Например, хостам в интрасети, возможно, придется использовать 192.168.0.100, но внешним машинам, возможно, придется использовать 65.123.66.124. Если у вас есть сокет подключение к другому хосту вы можете позвонить Socket.getLocalAddress (), чтобы узнать, какой локальный адрес используется для сокета. "

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