Как получить IP LAN клиента, использующего Java?

Как я могу получить IP-адрес LAN использующего компьютеры Java? Я хочу IP-адрес, который подключен к маршрутизатору и остальной части сети.

Я попробовал что-то вроде этого:

Socket s = new Socket("www.google.com", 80);
String ip = s.getLocalAddress().getHostAddress();
s.close();

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

Кто-либо получил более точный метод выполнения этого?

Править: Мысль было бы лучше спросить здесь, чем в комментарии..

Что, если Вы получили много интерфейсов? Например, один для кабеля, один для Wi-Fi и один для виртуального поля или около этого. Действительно ли невозможно на самом деле видеть, какой подключен к сети?

7
задан Matt 3 July 2013 в 16:14
поделиться

4 ответа

Попробуйте java.net.NetworkInterface

import java.net.NetworkInterface;

...

for (
    final Enumeration< NetworkInterface > interfaces =
        NetworkInterface.getNetworkInterfaces( );
    interfaces.hasMoreElements( );
)
{
    final NetworkInterface cur = interfaces.nextElement( );

    if ( cur.isLoopback( ) )
    {
        continue;
    }

    System.out.println( "interface " + cur.getName( ) );

    for ( final InterfaceAddress addr : cur.getInterfaceAddresses( ) )
    {
        final InetAddress inet_addr = addr.getAddress( );

        if ( !( inet_addr instanceof Inet4Address ) )
        {
            continue;
        }

        System.out.println(
            "  address: " + inet_addr.getHostAddress( ) +
            "/" + addr.getNetworkPrefixLength( )
        );

        System.out.println(
            "  broadcast address: " +
                addr.getBroadcast( ).getHostAddress( )
        );
    }
}
15
ответ дан 6 December 2019 в 07:50
поделиться

Сначала: нет единого адреса. У вашего компьютера как минимум два адреса (127.0.0.1 на «lo» и, возможно, 192.168.1.1 на «eth1»).

Вам нужно следующее: Список сетевых интерфейсов

Как и следовало ожидать, вы не можете автоматически определить, какой из них подключен к любому из ваших маршрутизаторов, поскольку это требует потенциально сложного анализа ваших таблиц маршрутизации. Но если вам просто нужен какой-либо нелокальный адрес, этого должно быть достаточно. Конечно, попробуйте использовать это хотя бы один раз в Vista или Windows 7, поскольку они добавляют адреса IPv6.

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNets 
{
    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
}  

Ниже приводится пример вывода из примера программы:

Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /121.153.225.59

Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
7
ответ дан 6 December 2019 в 07:50
поделиться
try {
    InetAddress addr = InetAddress.getLocalHost();

    // Get IP Address
    byte[] ipAddr = addr.getAddress();

    // Get hostname
    String hostname = addr.getHostName();
} catch (UnknownHostException e) {
}
0
ответ дан 6 December 2019 в 07:50
поделиться

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

private List<String> getLocalHostAddresses() {

    List<String> addresses = new ArrayList<String>();

    try {
        Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();

        while (e.hasMoreElements()) {
            NetworkInterface ni = e.nextElement();
            Enumeration<InetAddress> e2 = ni.getInetAddresses();
            while (e2.hasMoreElements())
                addresses.add(e2.nextElement().getHostAddress());
        }
        URL u = new URL("http://whatismyip.org");
        BufferedReader in = new BufferedReader(new InputStreamReader(
                u.openStream()));
        addresses.add(in.readLine());
        in.close();
    } catch (Exception ignore) {
    }

    return addresses;
}
1
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: