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

Java InetAddress.getLocalHost(); возвращает 127.0.0.1... как получить REAL IP?

Я пишу простое сетевое приложение... Мне нужно знать реальный ip моей машины в сети, например 192.168.1.3. getLocalHost возвращает 127.0.0.1 (на Linux, dunno, если это то же самое на windows), как это сделать?;

4b9b3361

Ответ 1

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

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

public class ShowInterfaces
{
        public static void main(String[] args) throws Exception
        {
                System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress());  // often returns "127.0.0.1"
                Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
                for (; n.hasMoreElements();)
                {
                        NetworkInterface e = n.nextElement();
                        System.out.println("Interface: " + e.getName());
                        Enumeration<InetAddress> a = e.getInetAddresses();
                        for (; a.hasMoreElements();)
                        {
                                InetAddress addr = a.nextElement();
                                System.out.println("  " + addr.getHostAddress());
                        }
                }
        }
}

Ответ 2

Поскольку у устройства может быть несколько адресов, трудно определить, какой из них для вас. Как правило, вы хотите, чтобы система назначала IP-адрес на основе своей таблицы маршрутизации. Поскольку результат зависит от IP, к которому вы хотите подключиться, существует простой трюк: просто создайте соединение и посмотрите, какой адрес у вас есть в ОС:

// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());

Я не уверен, возможно ли это сделать, не установив соединение. Кажется, мне когда-то удалось это сделать с Perl (или C?), Но не спрашивайте меня о Java. Я думаю, что возможно создать UDP-сокет (DatagramSocket), фактически не связав его.

Если есть NAT-маршрутизатор по пути, вы не сможете получить IP-адрес, который будут видеть удаленные хосты. Однако, как вы дали 192. * в качестве примера, я думаю, вам все равно.

Ответ 3

Чтобы исправить это:

  • Найдите имя своего хоста. Тип: hostname. Например, вы обнаружите, что ваше имя хоста mycomputer.xzy.com

  • Поместите имя своего хоста в файл вашего хоста. /etc/hosts. Например,

    10.50.16.136 mycomputer.xzy.com
    

Ответ 4

Вот способ избежать результатов IPv6 и Loopback.

public InetAddress getCurrentIp() {
            try {
                Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
                        .getNetworkInterfaces();
                while (networkInterfaces.hasMoreElements()) {
                    NetworkInterface ni = (NetworkInterface) networkInterfaces
                            .nextElement();
                    Enumeration<InetAddress> nias = ni.getInetAddresses();
                    while(nias.hasMoreElements()) {
                        InetAddress ia= (InetAddress) nias.nextElement();
                        if (!ia.isLinkLocalAddress() 
                         && !ia.isLoopbackAddress()
                         && ia instanceof Inet4Address) {
                            return ia;
                        }
                    }
                }
            } catch (SocketException e) {
                LOG.error("unable to get current IP " + e.getMessage(), e);
            }
            return null;
        }

Ответ 5

На вашем компьютере может быть несколько IP-адресов. Откуда вы знаете, какой? То, как я это делаю, - это иметь очень простой CGI, работающий на другом компьютере, который сообщает о просмотре IP-адреса, и я ударил его, когда мне нужно знать, как выглядит мой IP-адрес для внешнего мира.

Ответ 6

Вместо использования InetAddress.getHostAddress() я вызываю процедуру getHost4Address, которую я написал, чтобы получить первый адрес без петли...

/**
 * Returns this host non-loopback IPv4 addresses.
 * 
 * @return
 * @throws SocketException 
 */
private static List<Inet4Address> getInet4Addresses() throws SocketException {
    List<Inet4Address> ret = new ArrayList<Inet4Address>();

    Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
    for (NetworkInterface netint : Collections.list(nets)) {
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
                ret.add((Inet4Address)inetAddress);
            }
        }
    }

    return ret;
}

/**
 * Returns this host first non-loopback IPv4 address string in textual
 * representation.
 * 
 * @return
 * @throws SocketException
 */
private static String getHost4Address() throws SocketException {
    List<Inet4Address> inet4 = getInet4Addresses();
    return !inet4.isEmpty()
            ? inet4.get(0).getHostAddress()
            : null;
}

Ответ 7

Я написал этот код:

import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;


private String[] getHostAddresses() {
  Set<String> HostAddresses = new HashSet<>();
  try {
    for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) {
      if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) {
        for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
          if (ia.getBroadcast() != null) {  //If limited to IPV4
            HostAddresses.add(ia.getAddress().getHostAddress());
          }
        }
      }
    }
  } catch (SocketException e) { }
  return HostAddresses.toArray(new String[0]);
}

Проверьте это!

Для меня:

  • Должен быть не LoopBack!
  • Должен быть UP!
  • Должен иметь MAC-адрес (не равен нулю)

Ответ 8

Получить текущий запрос из текущего экземпляра

HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

затем получите адрес из запроса

ip = httpServletRequest.getRemoteAddr();

Ответ 9

Если вы хотите получить IP-адрес своего ПК, вы должны использовать объект InetAddress, который существует в библиотеке java.net.InetAddress.

Следующий метод возвращает ваш IP:

public String getIp() {

    String myIp = "";
    InetAddress ip;

    try {
        ip = InetAddress.getLocalHost();
        myIp = ip.getHostAddress();      // This method returns the IP.
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

    return myIp;
}