java InetAddress.getLocalHost (); возвращает 127.0.0.1 ... как получить РЕАЛЬНЫЙ IP? - PullRequest
51 голосов
/ 04 марта 2010

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

Ответы [ 11 ]

33 голосов
/ 07 сентября 2011

Если вы действительно хотите работать со всеми 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());
                        }
                }
        }
}
21 голосов
/ 04 марта 2010

Поскольку у машины может быть несколько адресов, сложно определить, какой из них вам подходит. Обычно вы хотите, чтобы система назначала 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. * в качестве примера, я думаю, что вам все равно.

18 голосов
/ 07 июля 2012

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

  1. Найдите ваше имя хоста. Тип: hostname. Например, вы нашли ваше имя хоста mycomputer.xzy.com

  2. Поместите имя вашего хоста в ваш файл hosts. /etc/hosts. Такие как

    10.50.16.136 mycomputer.xzy.com
    
11 голосов
/ 05 февраля 2015

Вот способ избежать результатов 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;
        }
3 голосов
/ 04 марта 2010

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

2 голосов
/ 20 декабря 2016

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

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-адрес (не ноль)
2 голосов
/ 18 сентября 2016

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

/**
 * Returns this host's 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's 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;
}
1 голос
/ 11 марта 2019

Получить IP-адрес текущего поля, соответствующего шаблону:

import java.io.*; 
import java.util.*; 
import java.util.regex.Pattern; 

String ipPattern = "(192.1.200.)(\\d){1,3}";      //your organization pattern 
try{ 
    Enumeration en = NetworkInterface.getNetworkInterfaces(); 
    while (en.hasMoreElements()) { 
        NetworkInterface ni = (NetworkInterface) en.nextElement(); 
        Enumeration ee = ni.getInetAddresses(); 
        while (ee.hasMoreElements()) { 
            InetAddress ia = (InetAddress) ee.nextElement(); 
            String ip = ia.getHostAddress(); 
            System.out.println("ip: '" + ip + "'\n"); 
            boolean matched = Pattern.matches(ipPattern, ip); 
            if (matched) { 
                System.out.println("matched\n"); 
            }
        } 
    } 
} 
catch(Exception e){ } 

Результат:

ip: 'fe80:0:0:0:510a:528b:7204:39d0%enp0s25'
ip: '192.1.200.3'
matched
ip: '0:0:0:0:0:0:0:1%lo'
ip: '127.0.0.1'
1 голос
/ 28 апреля 2015

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

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

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

ip = httpServletRequest.getRemoteAddr();
0 голосов
/ 30 марта 2019

Самое короткое решение у меня та же проблема

После поиска я обнаружил, что PCHsotName получил 127.0.1.1 IP-адрес в файле "/ etc / hosts"

1) Итак, откройте файл / etc / hosts с помощью любого редактора

я использовал нано

$ sudo nano /etc/hosts

2) и добавьте "#" в начале строки

127.0.1.1 HostName

Как

#127.0.1.1 HostName

3) Ctrl + O для сохранения

4) Ctrl + X для выхода из нано редактора

ПРИМЕЧАНИЕ: «HostName» Зависит от имени вашего компьютера или сервера.

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