IP-адрес не получен в Java

Этот код раньше возвращал мой локальный 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)

Решение Вопроса

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

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

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

If there is a security manager, its checkConnect method is called with the local host name and -1 as its arguments to see if the operation is allowed. If the operation is not allowed, an InetAddress representing the loopback address is returned.

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

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

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

(Я не думаю, что этоhugely конфиденциальная информация :)

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

 25 мая 2010 г., 19:18
Почему перед IP-адресом стоит косая черта?
 16 нояб. 2011 г., 19:55
@ Mat & # xED; as Это Java toString объекта InetAddress, использующего address.getHostAddress (), чтобы получить только числа, разделенные точками.
 30 июн. 2009 г., 08:57
В приведенном выше цикле вы также можете просто пропустить цикл, проверив NetworkInterface # isLoopback ().

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

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

NetworkInterface ni = NetworkInterface.getByName("eth1");
ni.getInetAddresses();

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

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

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

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

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

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

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

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

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

Ваш ответ на вопрос