Неожиданный конец в getLocalHost с InetAddress

Я нуждаюсь в том, чтобы присоединиться в команду используя RMI, но у класса сервера проекта есть следующая линия:

InetAddress.getLocalHost().toString()

Которой согласно документации я жду, возвратился один String с сетевым адресом моей машины, я присоединен к сети и ждала бы различная IP в localhost, однако этот метод возвращается 127.0.1.1.

Здесь у меня есть код проекта.

1
задан 01.04.2016, 17:00
1 ответ

Мне кажется, что проблема - сетевые интерфейсы. В моей машине я имею eth0 и lo:

$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 34:17:eb:d8:9e:83  
          inet addr:10.91.11.30  Bcast:10.91.11.255  Mask:255.255.255.0
          inet6 addr: fe80::3617:ebff:fed8:9e83/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12685226 errors:0 dropped:321209 overruns:0 frame:0
          TX packets:6092251 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6504196254 (6.5 GB)  TX bytes:1019289759 (1.0 GB)
          Interrupt:20 Memory:f7e00000-f7e20000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:587126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:587126 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:259789919 (259.7 MB)  TX bytes:259789919 (259.7 MB)

Если я выполняю следующий код:

import java.net.*;

public class Address {
    public static void main(String[] args) {
        try {
            InetAddress IP = InetAddress.getLocalHost();
            System.out.println("Mi IP es: " + IP.getHostAddress());
        } catch( UnknownHostException e ) {
          System.out.println(e);
        }   
    }    
}

Результат:

$ java Address
Mi IP es: 127.0.1.1

И этого достаточно, далеко от которого ты ищешь. Однако, если мы повторяем интерфейсы и imprimos IP - адреса мы можем приближаться больше:

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

public class Address {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            System.out.println("------------------");
            while (interfaces.hasMoreElements()) {
                NetworkInterface interfaz = interfaces.nextElement();
                System.out.println("Interfaz: " + interfaz.getDisplayName());
                Enumeration<InetAddress> direccion = interfaz.getInetAddresses();
                while (direccion.hasMoreElements()) {
                    InetAddress ip = direccion.nextElement();
                    System.out.println(ip.getHostAddress());
                }
                System.out.println("------------------");
            }
        } catch(SocketException e) {
            System.out.println(e);
        }
    }
}

Результат предыдущего кода был бы:

$ java Address
------------------
Interfaz: eth0
fe80:0:0:0:3617:ebff:fed8:9e83%2
10.91.11.30
------------------
Interfaz: lo
0:0:0:0:0:0:0:1%1
127.0.0.1
------------------

Уже у нас есть интерфейсы, и адреса IPv4 и IPv6 каждого интерфейса.

Даже ты мог бы избавляться от Loopback используя метод isLoopback интерфейса:

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

public class Address {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            System.out.println("------------------");
            while (interfaces.hasMoreElements()) {
                NetworkInterface interfaz = interfaces.nextElement();
                // No necesitamos el Loopback
                if (interfaz.isLoopback()) {
                    continue;
                }
                System.out.println("Interfaz: " + interfaz.getDisplayName());
                Enumeration<InetAddress> direccion = interfaz.getInetAddresses();
                while (direccion.hasMoreElements()) {
                    InetAddress ip = direccion.nextElement();
                    System.out.println(ip.getHostAddress());
                }
                System.out.println("------------------");
            }
        } catch(SocketException e) {
            System.out.println(e);
        }
    }
}

Сейчас результат был бы:

$ java Address 
------------------
Interfaz: eth0
fe80:0:0:0:3617:ebff:fed8:9e83%2
10.91.11.30
------------------

Если ты не нуждаешься в IPv6, ты можешь спрашивать, если IP в вопросе - инстанции Inet6Address:

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

public class Address {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            System.out.println("------------------");
            while (interfaces.hasMoreElements()) {
                NetworkInterface interfaz = interfaces.nextElement();
                // No necesitamos el Loopback
                if (interfaz.isLoopback()) {
                    continue;
                }
                System.out.println("Interfaz: " + interfaz.getDisplayName());
                Enumeration<InetAddress> direccion = interfaz.getInetAddresses();
                while (direccion.hasMoreElements()) {
                    InetAddress ip = direccion.nextElement();
                    // Solo IPv4
                    if (ip instanceof Inet6Address) {
                        continue;
                    }
                    System.out.println(ip.getHostAddress());
                }
                System.out.println("------------------");
            }
        } catch(SocketException e) {
            System.out.println(e);
        }
    }
}

В конце концов, результат:

$ java Address 
------------------
Interfaz: eth0
10.91.11.30
------------------

Ну, я думаю, что это уже приближает достаточно, во что ты ищешь.

Ссылки

2
ответ дан 24.11.2019, 14:39
  • 1
    Заметь: ты можешь менять for(; interfaces.hasMoreElements();) на while(interfaces.hasMoreElements()). Превосходный ответ, конечно. –  01.04.2016, 18:08
  • 2
    @LuiggiMendoza спасибо степень магистра! – César 01.04.2016, 18:10
  • 3
    jaja @LuiggiMendoza тот же комментарий... здесь. stackoverflow.com/questions/2381316/… – rnrneverdies 01.04.2016, 19:05
  • 4
    @rnd совпадения жизни (: –  01.04.2016, 19:09
  • 5
    @rnd, когда aprend и # 237; Java всегда использовал эту форму, всегда забывал while – César 01.04.2016, 19:10