Подтвердить что ты не робот

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());
    }
  }
}
4b9b3361

Ответ 1

127.0.0.1 - это loopback-адаптер - это совершенно правильный ответ на (несколько малейший) вопрос: "Каков мой IP-адрес?"

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

EDIT: Документы для getLocalHost говорят:

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

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

EDIT: Я считаю, что 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(...), а затем посмотрите адреса для этого интерфейса (как показано в приведенном выше коде).

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

javadoc для InetAddress.getLocalHost(); read ".... возвращается InetAddress, представляющий обратный адрес обратной связи." поэтому представляется, что реализация getLocalHost() неверна на ваши окна UNIX и WIN. Обратная петля почти всегда 127.0.0.1

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