Как получить IP-адрес локальной сети клиента, использующего Java? - PullRequest
7 голосов
/ 17 мая 2010

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

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

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

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

У кого-нибудь есть более точный способ сделать это?

РЕДАКТИРОВАТЬ: Думал, что лучше спросить здесь, чем в комментарии ..

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

Ответы [ 5 ]

15 голосов
/ 17 мая 2010

Попробуйте 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( )
        );
    }
}
7 голосов
/ 17 мая 2010

Сначала: нет единого адреса. У вашей машины есть как минимум два адреса (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
1 голос
/ 17 мая 2010

Это метод, который я использовал некоторое время. Он включает в себя небольшой хак, чтобы выяснить внешне видимый 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;
}
0 голосов
/ 12 июля 2013

Как уже указывал Даниэль, вы не можете знать, какой интерфейс "подключен". Что если, например, на компьютере установлено несколько сетевых карт, которые обе подключены к отдельным физическим локальным сетям?

Пусть пользователь сам решит, какой интерфейс использовать, или попробуете их все, в зависимости от вашего варианта использования.

0 голосов
/ 17 мая 2010
try {
    InetAddress addr = InetAddress.getLocalHost();

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

    // Get hostname
    String hostname = addr.getHostName();
} catch (UnknownHostException e) {
}
...