Mendapatkan alamat IP dari mesin saat ini menggunakan Java

291

Saya mencoba mengembangkan sistem di mana ada beberapa node yang dijalankan pada sistem yang berbeda atau pada port yang berbeda pada sistem yang sama.

Sekarang semua node membuat Socket dengan IP target sebagai IP dari node khusus yang dikenal sebagai node bootstrap. Node kemudian membuat sendiri ServerSocketdan mulai mendengarkan koneksi.

Node bootstrap memelihara daftar Node dan mengembalikannya saat ditanya.

Sekarang yang saya butuhkan adalah simpul harus mendaftarkan IP-nya ke simpul bootstrap. Saya mencoba menggunakan cli.getInetAddress()setelah klien terhubung ke ServerSocketsimpul bootstrap tapi itu tidak berhasil.

  1. Saya perlu klien untuk mendaftarkan IP PPP-nya jika tersedia;
  2. Kalau tidak, IP LAN jika tersedia;
  3. Kalau tidak, ia harus mendaftar 127.0.0.1 dengan asumsi komputer yang sama.

Menggunakan kode:

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

atau

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

Alamat IP Koneksi PPP saya adalah: 117.204.44.192 tetapi yang di atas mengembalikan saya 192.168.1.2

EDIT

Saya menggunakan kode berikut:

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());
    }
}

Saya bisa mendapatkan semua alamat IP yang terkait dengan semua NetworkInterface, tetapi bagaimana cara membedakannya? Ini adalah output yang saya dapatkan:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
sasidhar
sumber
Inet4Address.getLocalHost () harus berfungsi dengan benar?
Sears India
3
Di dalam loop jika saya menambahkan n.isPointToPoint () apakah itu akan berfungsi ?? Gagasan saya adalah mengembalikan "127.0.0.1" jika jaringan Point to Point tidak ditemukan. Apakah itu akan berhasil??
sasidhar
3
@sasidhar: Tolong jangan memposting alamat IP asli Anda. jangan menulis 117.xxx.xxx.xxx, untuk IP pribadi tidak apa-apa.
nIcE cOw
@GagandeepBali Terima kasih atas sarannya tetapi IP saya adalah IP dinamis dan saya mendapatkan IP baru setiap kali saya memutuskan koneksi dan menghubungkan internet saya. Jadi seharusnya tidak menjadi masalah, kurasa.
sasidhar
2
Terkait: stackoverflow.com/questions/6064510/...
AlikElzin-kilaka

Jawaban:

115
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();
}

Cara ini bekerja dengan baik ketika ada beberapa antarmuka jaringan. Itu selalu mengembalikan IP keluar yang disukai. Tujuan 8.8.8.8tidak perlu bisa dijangkau.

Connectpada soket UDP memiliki efek sebagai berikut: ia menetapkan tujuan untuk Kirim / Terima, membuang semua paket dari alamat lain, dan - yang kami gunakan - mentransfer soket ke keadaan "terhubung", mengatur bidang yang sesuai. Ini termasuk memeriksa keberadaan rute ke tujuan sesuai dengan tabel routing sistem dan mengatur titik akhir lokal yang sesuai. Bagian terakhir tampaknya tidak terdokumentasi secara resmi tetapi sepertinya sifat integral dari Berkeley sockets API (efek samping dari keadaan "terhubung" UDP) yang bekerja dengan andal di Windows dan Linux di seluruh versi dan distribusi.

Jadi, metode ini akan memberikan alamat lokal yang akan digunakan untuk terhubung ke host jarak jauh yang ditentukan. Tidak ada koneksi nyata yang dibuat, maka ip jarak jauh yang ditentukan dapat dijangkau.

Edit:

Seperti yang dikatakan @macomgil , untuk MacOS Anda dapat melakukan ini:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());
Mr.Wang dari Next Door
sumber
7
Ini bekerja untuk saya di linux tetapi di OsX saya mendapatkan: "0.0.0.0"
Radu Toader
@ Ya ampun, jawabannya diperbarui. Jika tidak berfungsi di OsX, maka Anda perlu memilih cara lain.
Mr.Wang dari Next Door
1
Cemerlang! FYI, ketika berhadapan dengan jaringan dalam tertutup, ganti saja 8.8.8.8 dengan sesuatu yang dapat dijangkau oleh setiap tuan rumah
Murphy Ng
Bekerja di Windows; dapatkah kami mengkonfirmasi jika OSX masih menjadi masalah?
trilogi
4
@trilogy Saya masih mendapatkan 0,0.0.0 di OSX
Peter Tutervai
273

Ini bisa agak rumit dalam kasus yang paling umum.

Di muka itu, InetAddress.getLocalHost()harus memberi Anda alamat IP dari host ini. Masalahnya adalah bahwa sebuah host dapat memiliki banyak antarmuka jaringan, dan sebuah antarmuka dapat terikat ke lebih dari satu alamat IP. Dan yang paling penting, tidak semua alamat IP dapat dijangkau di luar mesin Anda atau LAN Anda. Misalnya, mereka bisa berupa alamat IP untuk perangkat jaringan virtual, alamat IP jaringan pribadi, dan sebagainya.

Artinya, alamat IP yang dikembalikan oleh InetAddress.getLocalHost()mungkin bukan yang tepat untuk digunakan.

Bagaimana Anda bisa mengatasi ini?

  • Salah satu pendekatan adalah menggunakan NetworkInterface.getNetworkInterfaces()untuk mendapatkan semua antarmuka jaringan yang diketahui pada host, dan kemudian beralih ke alamat masing-masing NI.
  • Pendekatan lain adalah (entah bagaimana) mendapatkan FQDN yang diiklankan secara eksternal untuk host, dan gunakan InetAddress.getByName()untuk mencari alamat IP primer. (Tapi bagaimana Anda mendapatkannya, dan bagaimana Anda berurusan dengan load balancer berbasis DNS?)
  • Variasi dari yang sebelumnya adalah untuk mendapatkan FQDN yang disukai dari file konfigurasi atau parameter baris perintah.
  • Variasi lain adalah untuk mendapatkan alamat IP yang disukai dari file konfigurasi atau parameter baris perintah.

Singkatnya, InetAddress.getLocalHost()biasanya akan berfungsi, tetapi Anda mungkin perlu memberikan metode alternatif untuk kasus-kasus di mana kode Anda dijalankan di lingkungan dengan jaringan "rumit".


Saya bisa mendapatkan semua alamat IP yang terkait dengan semua Antarmuka Jaringan, tetapi bagaimana cara membedakannya?

  • Setiap alamat dalam kisaran 127.xxx.xxx.xxx adalah alamat "loopback". Ini hanya dapat dilihat oleh host "ini".
  • Setiap alamat dalam kisaran 192.168.xxx.xxx adalah alamat IP pribadi (alias situs lokal). Ini dicadangkan untuk digunakan dalam suatu organisasi. Hal yang sama berlaku untuk alamat 10.xxx.xxx.xxx, dan 172.16.xxx.xxx hingga 172.31.xxx.xxx.
  • Alamat dalam kisaran 169.254.xxx.xxx adalah tautan alamat IP lokal. Ini dicadangkan untuk digunakan pada segmen jaringan tunggal.
  • Alamat dalam kisaran 224.xxx.xxx.xxx hingga 239.xxx.xxx.xxx adalah alamat multicast.
  • Alamat 255.255.255.255 adalah alamat broadcast.
  • Apa pun yang lain harus menjadi alamat IPv4 point-to-point publik yang valid.

Faktanya, API InetAddress menyediakan metode untuk pengujian loopback, tautan lokal, situs lokal, multicast, dan alamat broadcast. Anda dapat menggunakan ini untuk memilah mana dari alamat IP yang Anda dapatkan yang paling tepat.

Stephen C
sumber
3
Jika ada yang penasaran, getLocalHost pada dasarnya melakukan pencarian DNS pada nama host server. Jika mendapat alamat IP dari pencarian itu maka pencarian melalui antarmuka yang tersedia untuk melihat antarmuka mana yang memiliki alamat IP itu dan mengembalikan antarmuka itu. Ini berarti getLocalHost akan cenderung bekerja di lingkungan "server" di mana IP keluar adalah yang memetakan ke nama host server.
Laju
1
Pada Ubuntu 14.04 api ini mengembalikan 127.0.1.1 meskipun ifconfig hanya melaporkan dua antarmuka, yang saya inginkan (alamat ip yang dapat diakses publik), dan loopback (127.0.0.1). Aneh bahwa ia mengembalikan alias loopback yang berbeda.
ctpenrose
Saya akan menambahkan bahwa jika Anda use getLocalHost().getHostAddress()menerbitkan sesuatu, Anda mungkin melihat 0.0.0.0ketika melihat dari komputer lain di jaringan. Ini dijelaskan di sini. Inilah yang terjadi pada saya ketika saya menggunakan Gazebo di dua komputer
Peter Mitrano
57

Posting di sini menguji kode solusi ambiguitas IP dari https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () ambigu pada sistem 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;
    }
}
Vadzim
sumber
6
Harus dicatat bahwa ini masih tidak menyelesaikan ambuguity jika host memiliki beberapa antarmuka nerwork serupa.
Vadzim
1
jawaban di bawah lebih baik - stackoverflow.com/questions/9481865/… mendapatkan alamat ip lokal yang digunakan sebagai src untuk Default Gatway
Radu
Mengapa alamat ip ditambahkan dengan garis miring depan ..? seperti /10.39.0.17 ..?, Apakah selalu dengan cara ini harus dipangkas ..?
Kanagavelu Sugumar
51

Anda dapat menggunakan kelas InetAddress java untuk tujuan ini.

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

Output untuk sistem saya = IP of my system is := 10.100.98.228

getHostAddress () kembali

Mengembalikan string alamat IP dalam presentasi tekstual.

ATAU Anda juga bisa melakukannya

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

Output = IP of my system is := RanRag-PC/10.100.98.228

RanRag
sumber
9
Perhatikan bahwa 10.xxx adalah alamat pribadi, yang menunjukkan bahwa sistem Anda ada di jaringan NAT. Ini akan muncul sebagai alamat yang berbeda saat menghubungi dunia luar. Jika Anda benar-benar membutuhkan alamat IP eksternal, Anda harus menghubungi salah satu dari banyak situs yang akan mengembalikan alamat IP asal Anda. Ini mungkin bermanfaat bagi Anda. Sistem Anda hampir pasti tidak akan dapat dijangkau dari luar dalam hal apa pun.
Edward Falk
19

Ketika Anda mencari alamat "lokal" Anda, Anda harus mencatat bahwa setiap mesin tidak hanya memiliki satu antarmuka jaringan, dan setiap antarmuka dapat memiliki alamat lokal sendiri. Yang berarti mesin Anda selalu memiliki beberapa alamat "lokal".

Alamat "lokal" yang berbeda akan dipilih secara otomatis untuk digunakan ketika Anda menghubungkan ke titik akhir yang berbeda. Misalnya, ketika Anda terhubung google.com, Anda menggunakan alamat lokal "luar"; tetapi ketika Anda terhubung ke Anda localhost, alamat lokal Anda selalu localhostsendiri, karena localhost hanyalah sebuah loopback.

Di bawah ini ditunjukkan cara mengetahui alamat lokal Anda saat Anda berkomunikasi dengan google.com:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());
macomgil
sumber
Hebat !! - sangat mudah :)
smilyface
4
tambahkan socket.close () di akhir :)
MC
11

Contoh dalam scala (berguna untuk file 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
  }
Andrzej Jozwik
sumber
10

EDIT 1: Kode yang diperbarui, sejak tautan sebelumnya, tidak ada lagi

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);
    }
}

VERSI SEBENARNYA: Ini berhenti bekerja

Semoga cuplikan ini dapat membantu Anda mencapai ini:

// 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";
        }
    }
}
nIcE cOw
sumber
2
Solusinya akan berhasil, semoga jika saya selalu terhubung ke internet, tetapi saya tidak dijamin. Selain itu, ketika sistem tidak terhubung ke internet dan kemudian saya harus mengembalikan alamat IP LAN sistem jika ada, jika tidak localhost. Jadi bukan pilihan yang layak untuk saya. Ada cara lain ??
sasidhar
@sasidhar: Ketika Anda terhubung ke Internet, hanya dengan itu Anda akan memiliki IP publik saya kira, jika Anda tidak terhubung maka metode ini akan memberi Anda, IP lokal Anda atau LAN LAN, dan untuk kondisi terakhir seperti yang ditentukan oleh Anda Anda dapat mengembalikan "127.0.0.1", alih-alih mengembalikan Kesalahan.
nIcE cOw
1
Saya suka pendekatan Anda tetapi tautan itu tampaknya tidak berfungsi lagi !! Bisakah saya menempatkan pengontrol pada sistem saya sendiri untuk bekerja, bukan tautan eksternal itu dan jadi lebih andal ???
azerafati
1
@Bludream: Terima kasih banyak, karena telah memberitahukan hal ini kepada saya, bahwa tautannya tidak berfungsi lagi. Saya telah memperbarui pos, dengan beberapa masukan baru. Semoga ini berfungsi untuk usercase Anda. Mengenai pertanyaan Anda, saya benar-benar tidak tahu, cara mengatur pengontrol pada sistem Anda sendiri untuk membuatnya berfungsi. Jadi saya tidak akan bisa memberikan wawasan tentang topik ini, MY BAD. Terima kasih lagi dan TETAP
MENYENANGKAN
1
Sebanyak ini solusi keren, ini sangat tidak bisa diandalkan. Jika Anda memblokir utas utama (katakanlah) dan untuk alasan apa pun whatismyip.comyang turun selama beberapa waktu, aplikasi Anda juga akan turun :(. Atau itu akan mengembalikan data sampah dan menyebabkan perilaku yang tidak terduga. Juga, ini mengembalikan pencabut nyawa kebanyakan alamat IP dapat dideteksi oleh whatismyip.com, tidak harus alamat IP dari mesin yang Anda gunakan
Decoded
6

pertama-tama impor kelas

import java.net.InetAddress;

di kelas

  InetAddress iAddress = InetAddress.getLocalHost();
  String currentIp = iAddress.getHostAddress();
  System.out.println("Current IP address : " +currentIp); //gives only host address
Gautam
sumber
2
itu hanya memberikan alamat ip pertama bahkan jika itu bukan yang digunakan!
Yahya
6

Anda bisa menggunakan java.net.InetAddressAPI. Coba ini :

InetAddress.getLocalHost().getHostAddress();
Ved
sumber
5
itu hanya akan mengembalikan 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;
    }
JR
sumber
1
tolong, pertimbangkan untuk menambahkan beberapa penjelasan tentang apa yang kode Anda lakukan.
HCarrasko
4

Ini adalah contoh kerja dari jawaban DITERIMA di atas! Kelas NetIdentity ini akan menyimpan ip host internal, serta loopback lokal. Jika Anda menggunakan server berbasis DNS, seperti yang disebutkan di atas, Anda mungkin perlu menambahkan beberapa pemeriksaan lagi, atau mungkin pergi ke Rute File Konfigurasi.

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;
    }
}

Ketika saya menjalankan kode ini saya benar-benar mendapatkan hasil cetak seperti ini:

    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

Untuk penggunaan saya, saya sedang menyiapkan Server Upnp, itu membantu untuk memahami 'pola' yang saya cari. Beberapa objek yang dikembalikan adalah Adaptor Ethernet, Adaptor Jaringan, Adaptor Jaringan Virtual, Driver, dan Adaptor Klien VPN. Tidak semuanya memiliki Alamat. Jadi, Anda ingin melewatkan objek antarmuka yang tidak.

Anda juga dapat menambahkan ini ke loop untuk saat ini 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());
}

Dan Anda akan melihat informasi dalam output Anda seperti ini:

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
Diterjemahkan
sumber
3

Gunakan InetAddress.getLocalHost () untuk mendapatkan alamat lokal

import java.net.InetAddress;

try {
  InetAddress addr = InetAddress.getLocalHost();            
  System.out.println(addr.getHostAddress());
} catch (UnknownHostException e) {
}
vdeantoni
sumber
Alamat IP Koneksi PPP saya adalah: 117.204.44.192 Tetapi yang di atas mengembalikan saya 192.168.1.2
sasidhar
Anda perlu merangkak semua instance InetAddress yang tersedia dan mencari tahu mana yang tepat.
Decoded
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();
}
}
twatson0990
sumber
1

Pendekatan yang agak sederhana yang tampaknya berhasil ...

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();
}
Pantelis Natsiavas
sumber
1

Ini mendapatkan alamat IP jaringan Anda jika mesin Anda adalah bagian dari jaringan

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

Biasanya ketika saya mencoba mencari Alamat IP publik saya seperti cmyip.com atau www.iplocation.net , saya menggunakan cara ini:

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 ;
}
YCF_L
sumber
0

Karena sistem saya (seperti banyak sistem lainnya) memiliki berbagai antarmuka jaringan. InetAddress.getLocalHost()atau Inet4Address.getLocalHost()hanya mengembalikan yang tidak saya inginkan. Karena itu saya harus menggunakan pendekatan naif ini.

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.

Hanya hati-hati bahwa dalam pendekatan ini saya sudah tahu bahwa alamat IP yang saya inginkan adalah di 192.168.2subnet.

SepJaPro2.4
sumber
-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;
}
Maxple
sumber
tolong, tambahkan beberapa penjelasan tentang apa yang kode Anda lakukan.
HCarrasko