Отримання IP-адреси поточної машини за допомогою Java


291

Я намагаюся розробити систему, де є різні вузли, які запускаються в іншій системі або на різних портах в одній системі.

Тепер усі вузли створюють Socket з цільовим IP як IP спеціального вузла, відомого як вузол завантаження. Потім вузли створюють свої власні ServerSocketта починають слухати з'єднання.

Вузол завантаження підтримує список Вузлів і повертає їх за запитом.

Тепер мені потрібно те, що вузол повинен зареєструвати свій IP для вузла завантаження. Я намагався використати, cli.getInetAddress()як тільки клієнт підключиться до ServerSocketвузла завантаження, але це не спрацювало.

  1. Мені потрібен клієнт, щоб зареєструвати свій ІР-код ДПП, якщо такий є;
  2. В іншому випадку мережевий IP, якщо він є;
  3. В іншому випадку він повинен зареєструвати 127.0.0.1, вважаючи, що його той самий комп'ютер.

Використання коду:

System.out.println(Inet4Address.getLocalHost().getHostAddress());

або

System.out.println(InetAddress.getLocalHost().getHostAddress());

IP-адреса мого PPP-з'єднання: 117.204.44.192, але вищезазначене повертає мені 192.168.1.2

EDIT

Я використовую такий код:

Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
    NetworkInterface n = (NetworkInterface) e.nextElement();
    Enumeration ee = n.getInetAddresses();
    while (ee.hasMoreElements())
    {
        InetAddress i = (InetAddress) ee.nextElement();
        System.out.println(i.getHostAddress());
    }
}

Я можу отримати всі IP-адреси, пов'язані з усіма NetworkInterfaces, але як їх розрізнити? Це результат, який я отримую:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalHost () повинен працювати правильно?
Sears India

3
Всередині циклу, якщо я додам n.isPointToPoint (), це буде працювати ?? Моя ідея - повернути "127.0.0.1", якщо не знайдено мережі "Point to Point". Це буде працювати ??
сасидхар

3
@sasidhar: Будь ласка, не публікуйте справжню IP-адресу. пишіть 117.xxx.xxx.xxx, для приватного IP це нормально.
nIcE cOw

@GagandeepBali Дякую за пораду, але мій IP - це динамічний IP, і я отримую новий IP кожен раз, коли відключаюсь та підключаю свій Інтернет. Тому, мабуть, це не повинно бути проблемою.
сасидхар

Відповіді:


116
import java.net.DatagramSocket;
import java.net.InetAddress;

try(final DatagramSocket socket = new DatagramSocket()){
  socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
  ip = socket.getLocalAddress().getHostAddress();
}

Цей спосіб добре працює, коли є кілька мережевих інтерфейсів. Він завжди повертає бажаний вихідний IP. Місце призначення 8.8.8.8не потрібно, щоб бути доступним.

Connectна UDP-сокет має такий ефект: він встановлює призначення для Send / Recv, відкидає всі пакети з інших адрес і - для чого ми використовуємо - переносить сокет у стан "підключення", встановлює відповідні поля. Це включає перевірку існування маршруту до пункту призначення відповідно до таблиці маршрутизації системи та відповідно встановлення локальної кінцевої точки. Остання частина здається офіційно недокументованою, але вона виглядає як інтегральна ознака API Berkeley sockets (побічний ефект стану "підключеного" UDP), який надійно працює в Windows та Linux у різних версіях та дистрибутивах.

Отже, цей метод дасть локальну адресу, яка використовувалася б для підключення до вказаного віддаленого хоста. Реального зв'язку не встановлено, отже, вказаний віддалений ip може бути недоступним.

Редагувати:

Як говорить @macomgil , для MacOS ви можете зробити це:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());

7
Він працював для мене на Linux, але на OsX я отримую: "0.0.0.0"
Radu Toader

@Jeef, відповідь оновлена. Якщо це не працює на OsX, то вам потрібно вибрати інший шлях.
Містер Ванг із сусідніх дверей

1
Блискуче! FYI, маючи справу із закритою внутрішньою мережею, просто замініть 8.8.8.8 тим, до чого може дістатися кожен хост
Мерфі Нг

Працює на Windows; чи можемо ми підтвердити, чи все ще проблема з OSX?
трилогія

4
@trilogy Я все ще отримую 0.0.0.0 на OSX
Пітер Тутервай

273

Це може бути трохи хитромудрим у найбільш загальному випадку.

З іншого боку, вам InetAddress.getLocalHost()слід вказати IP-адресу цього хоста. Проблема полягає в тому, що хост може мати безліч мережевих інтерфейсів, а інтерфейс може бути пов'язаний з більш ніж однією IP-адресою. На додаток до цього, не всі IP-адреси будуть доступні за межами Вашої машини чи вашої локальної мережі. Наприклад, це можуть бути IP-адреси для пристроїв віртуальної мережі, IP-адреси приватних мереж тощо.

Це означає, що IP-адреса, яку повертає, InetAddress.getLocalHost()може бути не правильною для використання.

Як можна впоратися з цим?

  • Одним із підходів є використання NetworkInterface.getNetworkInterfaces()для отримання всіх відомих мережевих інтерфейсів на хості, а потім ітерація над адресами кожного NI.
  • Інший підхід полягає в тому, щоб (якось) отримати зовнішньо рекламований FQDN для хоста і використовувати InetAddress.getByName()для пошуку первинної IP-адреси. (Але як ви це отримуєте, і як ви маєте справу з балансиром навантаження на основі DNS?)
  • Варіацією попереднього є отримання бажаного FQDN з конфігураційного файла або параметра командного рядка.
  • Іншою варіантом є отримання бажаної IP-адреси з конфігураційного файла або параметра командного рядка.

Підсумовуючи це, InetAddress.getLocalHost()як правило, спрацює, але вам може знадобитися надати альтернативний метод для випадків, коли ваш код запускається в середовищі зі "складною" мережею.


Я можу отримати всі IP-адреси, пов’язані з усіма мережевими інтерфейсами, але як я їх розрізняю?

  • Будь-яка адреса в діапазоні 127.xxx.xxx.xxx - це "петльова" адреса. Видно лише цьому "цьому" хосту.
  • Будь-яка адреса в діапазоні 192.168.xxx.xxx - це приватна IP-адреса (він же місцевий сайт). Вони зарезервовані для використання в організації. Те саме стосується адрес 10.xxx.xxx.xxx та 172.16.xxx.xxx через 172.31.xxx.xxx.
  • Адреси діапазону 169.254.xxx.xxx - це локальні IP-адреси посилання. Вони зарезервовані для використання в одному сегменті мережі.
  • Адреси в діапазоні 224.xxx.xxx.xxx до 239.xxx.xxx.xxx - це адреси для багатоадресної передачі.
  • Адреса 255.255.255.255 - адреса широкомовної передачі.
  • Все інше має бути дійсною загальнодоступною IPv4-адресою.

Фактично, API InetAddress надає методи тестування на зворотний зв'язок, локальну посилання, локальний сайт, багатоадресні та широкомовні адреси. Ви можете скористатися ними, щоб визначити, який із IP-адрес, які ви отримаєте, є найбільш підходящим.


3
Якщо комусь цікаво, getLocalHost по суті робить пошук DNS на імені хоста сервера. Якщо він отримує IP-адресу з цього пошуку, то він здійснює пошук через доступні інтерфейси, щоб побачити, який інтерфейс має цю IP-адресу, і він повертає цей інтерфейс. Це означає, що getLocalHost буде прагнути працювати в "серверному" середовищі, де вихідний IP - той, який відображається на ім'я хоста сервера.
Темп

1
На Ubuntu 14.04 ця програма повертає 127.0.1.1, навіть якщо ifconfig повідомляє лише про два інтерфейси, той, який я хочу (загальнодоступна ip-адреса) та зворотний зв'язок (127.0.0.1). Дивно, що він повертає інший псевдонім із петлею.
ctpenrose

Додам, що якщо ви use getLocalHost().getHostAddress()щось опублікуєте, ви можете побачити, 0.0.0.0коли дивитесь із північного комп’ютера в мережі. Це пояснюється тут Ось що трапилося зі мною, коли я використовував « Альтанку» на двох комп’ютерах
Пітер Мітрано

57

Розміщення тут перевіреного коду вирішення неоднозначності IP-адреси від https://isissue.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () неоднозначний у системах Linux):

/**
 * Returns an <code>InetAddress</code> object encapsulating what is most likely the machine's LAN IP address.
 * <p/>
 * This method is intended for use as a replacement of JDK method <code>InetAddress.getLocalHost</code>, because
 * that method is ambiguous on Linux systems. Linux systems enumerate the loopback network interface the same
 * way as regular LAN network interfaces, but the JDK <code>InetAddress.getLocalHost</code> method does not
 * specify the algorithm used to select the address returned under such circumstances, and will often return the
 * loopback address, which is not valid for network communication. Details
 * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4665037">here</a>.
 * <p/>
 * This method will scan all IP addresses on all network interfaces on the host machine to determine the IP address
 * most likely to be the machine's LAN address. If the machine has multiple IP addresses, this method will prefer
 * a site-local IP address (e.g. 192.168.x.x or 10.10.x.x, usually IPv4) if the machine has one (and will return the
 * first site-local address if the machine has more than one), but if the machine does not hold a site-local
 * address, this method will return simply the first non-loopback address found (IPv4 or IPv6).
 * <p/>
 * If this method cannot find a non-loopback address using this selection algorithm, it will fall back to
 * calling and returning the result of JDK method <code>InetAddress.getLocalHost</code>.
 * <p/>
 *
 * @throws UnknownHostException If the LAN address of the machine cannot be found.
 */
private static InetAddress getLocalHostLANAddress() throws UnknownHostException {
    try {
        InetAddress candidateAddress = null;
        // Iterate all NICs (network interface cards)...
        for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
            NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
            // Iterate all IP addresses assigned to each card...
            for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
                InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
                if (!inetAddr.isLoopbackAddress()) {

                    if (inetAddr.isSiteLocalAddress()) {
                        // Found non-loopback site-local address. Return it immediately...
                        return inetAddr;
                    }
                    else if (candidateAddress == null) {
                        // Found non-loopback address, but not necessarily site-local.
                        // Store it as a candidate to be returned if site-local address is not subsequently found...
                        candidateAddress = inetAddr;
                        // Note that we don't repeatedly assign non-loopback non-site-local addresses as candidates,
                        // only the first. For subsequent iterations, candidate will be non-null.
                    }
                }
            }
        }
        if (candidateAddress != null) {
            // We did not find a site-local address, but we found some other non-loopback address.
            // Server might have a non-site-local address assigned to its NIC (or it might be running
            // IPv6 which deprecates the "site-local" concept).
            // Return this non-loopback candidate address...
            return candidateAddress;
        }
        // At this point, we did not find a non-loopback address.
        // Fall back to returning whatever InetAddress.getLocalHost() returns...
        InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
        if (jdkSuppliedAddress == null) {
            throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
        }
        return jdkSuppliedAddress;
    }
    catch (Exception e) {
        UnknownHostException unknownHostException = new UnknownHostException("Failed to determine LAN address: " + e);
        unknownHostException.initCause(e);
        throw unknownHostException;
    }
}

6
Слід зазначити, що це все ще не вирішує амбугуантність, якщо хост має кілька подібних інтерфейсів.
Вадзім

1
нижче відповідь краще - stackoverflow.com/questions/9481865/… отримує локальну ip адресу, яка використовується як src для Gatway за замовчуванням
Radu Toader

Чому ip-адреса додається з передньою косою рисою ..? як /10.39.0.17 ..?, чи завжди цей спосіб слід обрізати ..?
Kanagavelu Sugumar

51

Для цього можна використовувати клас InetAddress Java .

InetAddress IP=InetAddress.getLocalHost();
System.out.println("IP of my system is := "+IP.getHostAddress());

Вихід для моєї системи = IP of my system is := 10.100.98.228

getHostAddress () повертається

Повертає рядок IP-адреси в текстовій презентації.

АБО ви також можете зробити

InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.toString());

Вихід = IP of my system is := RanRag-PC/10.100.98.228


9
Зауважте, що 10.xxx - це приватна адреса, що вказує на те, що ваша система перебуває в мережі NAT. Він з’явиться як інша адреса при контакті із зовнішнім світом. Якщо вам справді потрібна зовнішня IP-адреса, вам доведеться зв’язатися з одним із багатьох сайтів, який повторить вам IP-адресу, з якої ви надходите. Це може вам чи не корисно. Ваша система майже напевно не буде доступна ззовні ні в якому разі.
Едвард Фолк

19

Коли ви шукаєте свою "локальну" адресу, слід зауважити, що кожна машина має не лише один мережевий інтерфейс, і кожен інтерфейс може мати свою локальну адресу. Це означає, що ваша машина завжди володіє кількома "локальними" адресами.

Різні "локальні" адреси будуть автоматично обрані для використання під час підключення до різних кінцевих точок. Наприклад, коли ви підключаєтесь google.com, ви використовуєте "зовнішню" локальну адресу; але коли ви підключаєтесь до своєї localhost, ваша локальна адреса завжди є localhostсамою, оскільки localhost - це лише зворотний зв'язок.

Нижче показано, як дізнатися свою локальну адресу під час спілкування з google.com:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());

Дивовижно !! - так просто :)
smilyface

4
додати socket.close () наприкінці :)
MC

11

Приклад в scala (корисно у файлі sbt):

  import collection.JavaConverters._
  import java.net._

  def getIpAddress: String = {

    val enumeration = NetworkInterface.getNetworkInterfaces.asScala.toSeq

    val ipAddresses = enumeration.flatMap(p =>
      p.getInetAddresses.asScala.toSeq
    )

    val address = ipAddresses.find { address =>
      val host = address.getHostAddress
      host.contains(".") && !address.isLoopbackAddress
    }.getOrElse(InetAddress.getLocalHost)

    address.getHostAddress
  }

10

EDIT 1: Оновлений код, оскільки попереднє посилання більше не існує

import java.io.*;
import java.net.*;

public class GetMyIP {
    public static void main(String[] args) {
        URL url = null;
        BufferedReader in = null;
        String ipAddress = "";
        try {
            url = new URL("http://bot.whatismyipaddress.com");
            in = new BufferedReader(new InputStreamReader(url.openStream()));
            ipAddress = in.readLine().trim();
            /* IF not connected to internet, then
             * the above code will return one empty
             * String, we can check it's length and
             * if length is not greater than zero, 
             * then we can go for LAN IP or Local IP
             * or PRIVATE IP
             */
            if (!(ipAddress.length() > 0)) {
                try {
                    InetAddress ip = InetAddress.getLocalHost();
                    System.out.println((ip.getHostAddress()).trim());
                    ipAddress = (ip.getHostAddress()).trim();
                } catch(Exception exp) {
                    ipAddress = "ERROR";
                }
            }
        } catch (Exception ex) {
            // This try will give the Private IP of the Host.
            try {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                ipAddress = (ip.getHostAddress()).trim();
            } catch(Exception exp) {
                ipAddress = "ERROR";
            }
            //ex.printStackTrace();
        }
        System.out.println("IP Address: " + ipAddress);
    }
}

ДІЯЛЬНА ВЕРСІЯ: Це припинило роботу

Сподіваємось, цей фрагмент може допомогти вам досягти цього:

// Method to get the IP Address of the Host.
private String getIP()
{
    // This try will give the Public IP Address of the Host.
    try
    {
        URL url = new URL("http://automation.whatismyip.com/n09230945.asp");
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String ipAddress = new String();
        ipAddress = (in.readLine()).trim();
        /* IF not connected to internet, then
         * the above code will return one empty
         * String, we can check it's length and
         * if length is not greater than zero, 
         * then we can go for LAN IP or Local IP
         * or PRIVATE IP
         */
        if (!(ipAddress.length() > 0))
        {
            try
            {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                return ((ip.getHostAddress()).trim());
            }
            catch(Exception ex)
            {
                return "ERROR";
            }
        }
        System.out.println("IP Address is : " + ipAddress);

        return (ipAddress);
    }
    catch(Exception e)
    {
        // This try will give the Private IP of the Host.
        try
        {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println((ip.getHostAddress()).trim());
            return ((ip.getHostAddress()).trim());
        }
        catch(Exception ex)
        {
            return "ERROR";
        }
    }
}

2
Рішення спрацює, сподіваюся, якщо я завжди підключуюся до Інтернету, але мені це не гарантується. Крім того, коли система не підключена до Інтернету, і мені потрібно повернути локальну IP-адресу системи, якщо така є, інакше localhost. Тож для мене не можливий варіант. Будь-який інший спосіб ??
сасидхар

@sasidhar: Коли ви підключились до Інтернету, тільки тоді ви маєте ваш загальнодоступний IP ви можете повернути "127.0.0.1", замість того, щоб повертати помилку.
NIcE COw

1
Мені подобається ваш підхід, але це посилання, здається, більше не працює !! Чи можу я поставити контролер в моїй власній системі для роботи замість цього зовнішнього посилання і таким чином бути більш надійним ???
azerafati

1
@Bludream: Дякую тобі за те, що мені це стало відомо, що посилання вже не працює. Я оновив публікацію з деякими новими вводами. Сподіваємось, він працює для вашого користувача. Щодо вашого питання, я дійсно не знаю, як налаштувати контролер на власну систему, щоб він працював. Тож я не зможу дати зрозуміти цю тему, МОЙ БАД. Ще раз дякую та КЛІНУЙТЕ СМИЛЕННЯ :-)
NIcE COw

1
Наскільки це класне рішення, це надзвичайно ненадійно. Якби ви блокували основний потік (давайте скажемо) і з будь-якої причини whatismyip.comбули вимкнені протягом певного часу, ваш додаток також буде відключений :(. Або він поверне дані про сміття і спричинить несподівану поведінку. Крім того, це поверне програвач більшість IP-адрес, які можна виявити за допомогою whatismyip.com, не обов'язково ip-адреси машини, яку ви використовуєте.
Розшифровано

6

по-перше, імпортуйте клас

import java.net.InetAddress;

в класі

  InetAddress iAddress = InetAddress.getLocalHost();
  String currentIp = iAddress.getHostAddress();
  System.out.println("Current IP address : " +currentIp); //gives only host address

2
він дає лише першу ip-адресу, навіть якщо вона не використовується!
Yahya

6

Ви можете використовувати java.net.InetAddressAPI. Спробуйте це :

InetAddress.getLocalHost().getHostAddress();

5
це просто повернеться 127.0.0.1
HCarrasko

5
private static InetAddress getLocalAddress(){
        try {
            Enumeration<NetworkInterface> b = NetworkInterface.getNetworkInterfaces();
            while( b.hasMoreElements()){
                for ( InterfaceAddress f : b.nextElement().getInterfaceAddresses())
                    if ( f.getAddress().isSiteLocalAddress())
                        return f.getAddress();
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return null;
    }

1
будь ласка, подумайте, додайте пояснення щодо того, що робить ваш код.
HCarrasko

4

Це робочий приклад прийнятої відповіді вище! Цей клас NetIdentity буде зберігати як внутрішній ip хосту, так і локальний цикл зворотного зв'язку. Якщо ви перебуваєте на сервері на базі DNS, як згадувалося вище, можливо, вам доведеться додати ще кілька перевірок або, можливо, перейти до маршруту конфігураційного файлу.

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * Class that allows a device to identify itself on the INTRANET.
 * 
 * @author Decoded4620 2016
 */
public class NetIdentity {

    private String loopbackHost = "";
    private String host = "";

    private String loopbackIp = "";
    private String ip = "";
    public NetIdentity(){

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

            while(interfaces.hasMoreElements()){
                NetworkInterface i = interfaces.nextElement();
                if(i != null){
                    Enumeration<InetAddress> addresses = i.getInetAddresses();
                    System.out.println(i.getDisplayName());
                    while(addresses.hasMoreElements()){
                        InetAddress address = addresses.nextElement();
                        String hostAddr = address.getHostAddress();

                        // local loopback
                        if(hostAddr.indexOf("127.") == 0 ){
                            this.loopbackIp = address.getHostAddress();
                            this.loopbackHost = address.getHostName();
                        }

                        // internal ip addresses (behind this router)
                        if( hostAddr.indexOf("192.168") == 0 || 
                                hostAddr.indexOf("10.") == 0 || 
                                hostAddr.indexOf("172.16") == 0 ){
                            this.host = address.getHostName();
                            this.ip = address.getHostAddress();
                        }


                        System.out.println("\t\t-" + address.getHostName() + ":" + address.getHostAddress() + " - "+ address.getAddress());
                    }
                }
            }
        }
        catch(SocketException e){

        }
        try{
            InetAddress loopbackIpAddress = InetAddress.getLocalHost();
            this.loopbackIp = loopbackIpAddress.getHostName();
            System.out.println("LOCALHOST: " + loopbackIp);
        }
        catch(UnknownHostException e){
            System.err.println("ERR: " + e.toString());
        }
    }

    public String getLoopbackHost(){
        return loopbackHost;
    }

    public String getHost(){
        return host;
    }
    public String getIp(){
        return ip;
    }
    public String getLoopbackIp(){
        return loopbackIp;
    }
}

Коли я запускаю цей код, я фактично отримую такий друк:

    Software Loopback Interface 1
        -127.0.0.1:127.0.0.1 - [B@19e1023e
        -0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
        -VIKING.yourisp.com:192.168.1.142 - [B@64b8f8f4
        -fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
Intel Edison USB RNDIS Device
Driver for user-mode network applications
Cisco Systems VPN Adapter for 64-bit Windows
VirtualBox Host-Only Ethernet Adapter
        -VIKING:192.168.56.1 - [B@3cd1f1c8
        -VIKING:fe80:0:0:0:d599:3cf0:5462:cb7%eth4 - [B@3a4afd8d
LogMeIn Hamachi Virtual Ethernet Adapter
        -VIKING:25.113.118.39 - [B@1996cd68
        -VIKING:2620:9b:0:0:0:0:1971:7627 - [B@3339ad8e
        -VIKING:fe80:0:0:0:51bf:994d:4656:8486%eth5 - [B@555590
Bluetooth Device (Personal Area Network)
        -fe80:0:0:0:4c56:8009:2bca:e16b%eth6:fe80:0:0:0:4c56:8009:2bca:e16b%eth6 - [B@3c679bde
Bluetooth Device (RFCOMM Protocol TDI)
Intel(R) Ethernet Connection (2) I218-V
        -fe80:0:0:0:4093:d169:536c:7c7c%eth7:fe80:0:0:0:4093:d169:536c:7c7c%eth7 - [B@16b4a017
Microsoft Wi-Fi Direct Virtual Adapter
        -fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1:fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1 - [B@8807e25
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0000
VirtualBox Host-Only Ethernet Adapter-WFP Native MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0001
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0002
VirtualBox Host-Only Ethernet Adapter-VirtualBox NDIS Light-Weight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0003
VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0004
VirtualBox Host-Only Ethernet Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0000
Intel(R) Ethernet Connection (2) I218-V-WFP Native MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0001
Intel(R) Ethernet Connection (2) I218-V-Shrew Soft Lightweight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0002
Intel(R) Ethernet Connection (2) I218-V-VirtualBox NDIS Light-Weight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0003
Intel(R) Ethernet Connection (2) I218-V-QoS Packet Scheduler-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0004
Intel(R) Ethernet Connection (2) I218-V-WFP 802.3 MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-WFP Native MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-Virtual WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-Native WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Broadcom 802.11ac Network Adapter-Shrew Soft Lightweight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Broadcom 802.11ac Network Adapter-VirtualBox NDIS Light-Weight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-QoS Packet Scheduler-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0006
Broadcom 802.11ac Network Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0007
Microsoft Wi-Fi Direct Virtual Adapter-WFP Native MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-Native WiFi Filter Driver-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0002
Microsoft Wi-Fi Direct Virtual Adapter-Shrew Soft Lightweight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Microsoft Wi-Fi Direct Virtual Adapter-VirtualBox NDIS Light-Weight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Microsoft Wi-Fi Direct Virtual Adapter-QoS Packet Scheduler-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0006

Для мого використання я налаштовував сервер Upnp, це допомогло зрозуміти «шаблон», який я шукав. Деякі повернуті об’єкти - це адаптери Ethernet, мережеві адаптери, віртуальні мережеві адаптери, драйвери та клієнтські адаптери VPN. Не у всіх теж є Адреса. Таким чином, ви захочете пропустити інтерфейсні об'єкти, яких немає.

Ви також можете додати це до циклу для поточного NetworkInterface i

while(interfaces.hasMoreElements()){
    Enumeration<InetAddress> addresses = i.getInetAddresses();
    System.out.println(i.getDisplayName());
    System.out.println("\t- name:" + i.getName());
    System.out.println("\t- idx:" + i.getIndex());
    System.out.println("\t- max trans unit (MTU):" + i.getMTU());
    System.out.println("\t- is loopback:" + i.isLoopback());
    System.out.println("\t- is PPP:" + i.isPointToPoint());
    System.out.println("\t- isUp:" + i.isUp());
    System.out.println("\t- isVirtual:" + i.isVirtual());
    System.out.println("\t- supportsMulticast:" + i.supportsMulticast());
}

І ви побачите інформацію у своєму результаті приблизно так:

Software Loopback Interface 1
    - name:lo
    - idx:1
    - max trans unit (MTU):-1
    - is loopback:true
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [127.0.0.1(VIKING-192.168.56.1)]127.0.0.1:127.0.0.1 - [B@19e1023e
        -ADRESS: [0:0:0:0:0:0:0:1(VIKING-192.168.56.1)]0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
    - name:wlan0
    - idx:2
    - max trans unit (MTU):1500
    - is loopback:false
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [VIKING.monkeybrains.net(VIKING-192.168.56.1)]VIKING.monkeybrains.net:192.168.1.142 - [B@64b8f8f4
        -ADRESS: [fe80:0:0:0:81fa:31d:21c9:85cd%wlan0(VIKING-192.168.56.1)]fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
    - name:eth0
    - idx:3
    - max trans unit (MTU):-1
    - is loopback:false
    - is PPP:false
    - isUp:false
    - isVirtual:false
    - supportsMulticast:true

3

Використовуйте InetAddress.getLocalHost (), щоб отримати локальну адресу

import java.net.InetAddress;

try {
  InetAddress addr = InetAddress.getLocalHost();            
  System.out.println(addr.getHostAddress());
} catch (UnknownHostException e) {
}

IP-адреса мого підключення до ДПП: 117.204.44.192 Але вищесказане повертає мене 192.168.1.2
sasidhar

Вам потрібно сканувати всі наявні екземпляри InetAddress і з'ясувати, який саме є правильним.
Розшифрований

1
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class IpAddress {

NetworkInterface ifcfg;
Enumeration<InetAddress> addresses;
String address;

public String getIpAddress(String host) {
    try {
        ifcfg = NetworkInterface.getByName(host);
        addresses = ifcfg.getInetAddresses();
        while (addresses.hasMoreElements()) {
            address = addresses.nextElement().toString();
            address = address.replace("/", "");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ifcfg.toString();
}
}

1

Досить спрощений підхід, який, здається, працює ...

String getPublicIPv4() throws UnknownHostException, SocketException{
    Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
    String ipToReturn = null;
    while(e.hasMoreElements())
    {
        NetworkInterface n = (NetworkInterface) e.nextElement();
        Enumeration<InetAddress> ee = n.getInetAddresses();
        while (ee.hasMoreElements())
        {
            InetAddress i = (InetAddress) ee.nextElement();
            String currentAddress = i.getHostAddress();
            logger.trace("IP address "+currentAddress+ " found");
            if(!i.isSiteLocalAddress()&&!i.isLoopbackAddress() && validate(currentAddress)){
                ipToReturn = currentAddress;    
            }else{
                System.out.println("Address not validated as public IPv4");
            }

        }
    }

    return ipToReturn;
}

private static final Pattern IPv4RegexPattern = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

public static boolean validate(final String ip) {
    return IPv4RegexPattern.matcher(ip).matches();
}

1

Це отримує IP-адресу вашої мережі, якщо ваш апарат є частиною мережі

try {
    System.out.println(InetAddress.getLocalHost().getHostAddress());
} catch (UnknownHostException e) {
    e.printStackTrace();
}

0

Зазвичай, коли я намагаюся знайти свою загальнодоступну IP-адресу, наприклад cmyip.com або www.iplocation.net , я використовую такий спосіб:

public static String myPublicIp() {

    /*nslookup myip.opendns.com resolver1.opendns.com*/
    String ipAdressDns  = "";
    try {
        String command = "nslookup myip.opendns.com resolver1.opendns.com";
        Process proc = Runtime.getRuntime().exec(command);

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String s;
        while ((s = stdInput.readLine()) != null) {
            ipAdressDns  += s + "\n";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return ipAdressDns ;
}

0

Оскільки моя система (як і багато інших систем) мала різні мережеві інтерфейси. InetAddress.getLocalHost()або Inet4Address.getLocalHost()просто повернув той, якого я не бажав. Тому мені довелося використовувати цей наївний підхід.

InetAddress[] allAddresses = Inet4Address.getAllByName("YourComputerHostName");
        InetAddress desiredAddress;
        //In order to find the desired Ip to be routed by other modules (WiFi adapter)
        for (InetAddress address :
                allAddresses) {
            if (address.getHostAddress().startsWith("192.168.2")) {
                desiredAddress = address;
            }
        }
// Use the desired address for whatever purpose.

Будьте обережні, що в такому підході я вже знав, що потрібна IP-адреса знаходиться в 192.168.2підмережі.


-1
public static String getIpAddress() {

    String ipAddress = null;

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

        while (networkInterfaces.hasMoreElements()) {

            NetworkInterface networkInterface = networkInterfaces.nextElement();

            byte[] hardwareAddress = networkInterface.getHardwareAddress();
            if (null == hardwareAddress || 0 == hardwareAddress.length || (0 == hardwareAddress[0] && 0 == hardwareAddress[1] && 0 == hardwareAddress[2])) continue;

            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();

            if (inetAddresses.hasMoreElements()) ipAddress = inetAddresses.nextElement().toString();

            break;
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }

    return ipAddress;
}

будь ласка, додайте пояснення щодо того, що робить ваш код.
HCarrasko
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.