Java kullanarak geçerli makinenin IP adresini alma


291

Farklı sistemde veya aynı sistemdeki farklı bağlantı noktalarında çalıştırılan farklı düğümlerin bulunduğu bir sistem geliştirmeye çalışıyorum.

Şimdi tüm düğümler, önyükleme düğümü olarak bilinen özel bir düğümün IP'si olarak hedef IP'ye sahip bir Soket oluşturur. Düğümler daha sonra kendi düğümlerini oluşturur ServerSocketve bağlantıları dinlemeye başlar.

Önyükleme düğümü Düğümlerin bir listesini tutar ve sorgulandığında onları döndürür.

Şimdi ihtiyacım olan düğüm onun önyükleme düğümü IP kayıt olmalıdır. cli.getInetAddress()Istemci ServerSocketbootstrapping düğümüne bağlandıktan sonra kullanmayı denedim ama işe yaramadı.

  1. Mümkünse PPP IP'sini kaydetmek için istemciye ihtiyacım var;
  2. Aksi takdirde, mevcutsa LAN IP'si;
  3. Aksi takdirde, aynı bilgisayarı varsayarak 127.0.0.1'i kaydetmelidir.

Kodu kullanarak:

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

veya

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

PPP Bağlantı IP adresim: 117.204.44.192 ama yukarıdakiler bana 192.168.1.2 veriyor

DÜZENLE

Aşağıdaki kodu kullanıyorum:

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

Tüm NetworkInterfaces ile ilişkili tüm IP adreslerini alabilirim , ancak bunları nasıl ayırt edebilirim? Bu alıyorum çıktı:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalHost () düzgün çalışmalı mı?
Sears Hindistan

3
Döngü içinde n.isPointToPoint () eklerseniz işe yarayacak ?? Benim fikrim bir Noktadan Noktaya ağ bulunmazsa "127.0.0.1" döndürmek. Çalışacak mı??
sasidhar

3
@ sasidhar: Lütfen gerçek IP adresinizi göndermeyin. Tamam olan özel IP için 117.xxx.xxx.xxx yazın.
Güzel

@GagandeepBali Tavsiye için teşekkürler ama IP adresim dinamik bir IP ve internet bağlantısını her kesip bağladığımda yeni bir IP alıyorum. Yani sorun olmamalı sanırım.
sasidhar

Yanıtlar:


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

Bu şekilde, birden çok ağ arabirimi olduğunda iyi çalışır. Her zaman tercih edilen giden IP'yi döndürür. Hedefe 8.8.8.8ulaşılması gerekmez.

Connectbir UDP soketinde aşağıdaki etkiye sahiptir: Gönder / Recv için hedefi belirler, diğer adreslerden tüm paketleri atar ve - kullandığımız bu - soketi "bağlı" duruma aktarır, uygun alanlarını ayarlar. Bu, sistemin yönlendirme tablosuna göre hedefe giden yolun varlığını kontrol etmeyi ve yerel bitiş noktasını buna göre ayarlamayı içerir. Son bölüm resmi olarak belgelenmemiş gibi görünüyor, ancak sürümler ve dağıtımlar arasında hem Windows hem de Linux'ta güvenilir bir şekilde çalışan Berkeley soketleri API'sının (UDP "bağlı" durumunun bir yan etkisi) ayrılmaz bir özelliğine benziyor.

Bu nedenle, bu yöntem belirtilen uzak ana bilgisayara bağlanmak için kullanılacak yerel adresi verecektir. Gerçek bir bağlantı kurulmamıştır, bu nedenle belirtilen uzak ip erişilemez.

Düzenle:

Gibi @macomgil diyor, MacOS bunu yapabilirsiniz:

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

7
Linux üzerinde benim için çalıştı ama OsX üzerinde: "0.0.0.0"
Radu Toader

@Jeef, cevap güncellendi. OsX üzerinde çalışmazsa, başka bir yol seçmeniz gerekir.
Next Door'dan Next Wang

1
Parlak! FYI, kapalı iç ağ ile uğraşırken, 8.8.8.8'i her ev sahibinin ulaşabileceği bir şeyle değiştirin
Murphy Ng

Windows üzerinde çalışır; hala bir sorun olup olmadığını onaylayabilir miyiz?
Trilogy

4
@trilogy Hala OSX'te 0.0.0.0 alıyorum
Peter Tutervai

273

Bu en genel durumda biraz zor olabilir.

Yüzünde InetAddress.getLocalHost(), bu ana bilgisayarın IP adresini vermelidir. Sorun, bir ana bilgisayarın çok sayıda ağ arabirimine sahip olması ve bir arabirimin birden fazla IP adresine bağlı olabilmesidir. Üstelik, tüm IP adreslerine makinenizin veya LAN'ınızın dışından erişilemez. Örneğin, sanal ağ aygıtları için IP adresleri, özel ağ IP adresleri vb. Olabilir.

Bunun anlamı, döndürülen IP adresinin InetAddress.getLocalHost()kullanmak için doğru adres olmayabilir.

Bununla nasıl başa çıkabilirsiniz?

  • Bir yaklaşım, NetworkInterface.getNetworkInterfaces()ana bilgisayardaki bilinen tüm ağ arabirimlerini almak ve daha sonra her NI'nin adresleri üzerinde yineleme yapmaktır.
  • Başka bir yaklaşım, ana bilgisayar için harici olarak reklamı yapılan FQDN'yi (bir şekilde) almak InetAddress.getByName()ve birincil IP adresini aramak için kullanmaktır . (Ancak bunu nasıl elde edersiniz ve DNS tabanlı bir yük dengeleyici ile nasıl başa çıkıyorsunuz?)
  • Öncekinin bir varyasyonu, bir yapılandırma dosyasından veya bir komut satırı parametresinden tercih edilen FQDN'yi elde etmektir.
  • Diğer bir varyasyon, tercih edilen IP adresini bir yapılandırma dosyasından veya bir komut satırı parametresinden almaktır.

Özet olarak, InetAddress.getLocalHost()genellikle işe yarayacaktır, ancak kodunuzun "karmaşık" ağ bağlantısı olan bir ortamda çalıştırıldığı durumlar için alternatif bir yöntem sağlamanız gerekebilir.


Tüm Ağ Arabirimleri ile ilişkili tüm IP adreslerini alabilirim, ancak bunları nasıl ayırt edebilirim?

  • 127.xxx.xxx.xxx aralığındaki herhangi bir adres bir "geri döngü" adresidir. Yalnızca "bu" ana makine tarafından görülebilir.
  • 192.168.xxx.xxx aralığındaki herhangi bir adres özel (yerel site olarak da bilinir) IP adresidir. Bunlar kuruluş içinde kullanılmak üzere ayrılmıştır. Aynı durum 10.xxx.xxx.xxx adresleri ve 172.16.xxx.xxx - 172.31.xxx.xxx için de geçerlidir.
  • 169.254.xxx.xxx aralığındaki adresler bağlantı yerel IP adresleridir. Bunlar tek bir ağ segmentinde kullanım için ayrılmıştır.
  • 224.xxx.xxx.xxx - 239.xxx.xxx.xxx aralığındaki adresler çok noktaya yayın adresleridir.
  • 255.255.255.255 adresi yayın adresidir.
  • Başka bir şey olmalı geçerli bir kamu noktadan noktaya IPv4 adresi.

Aslında, InetAddress API'si geri döngü, yerel bağlantı, site yerel, çok noktaya yayın ve yayın adreslerini test etmek için yöntemler sağlar. Geri aldığınız IP adreslerinden hangisinin en uygun olduğunu sıralamak için bunları kullanabilirsiniz.


3
Herkesin merak etmesi durumunda, getLocalHost aslında sunucunun ana bilgisayar adında bir DNS araması yapar. Bu aramadan bir IP adresi alırsa, hangi arabirimin bu IP adresine sahip olduğunu görmek için kullanılabilir arabirimleri arar ve bu arabirimi döndürür. Bu, getLocalHost'un, giden IP'nin sunucunun ana makine adıyla eşleştiği bir "sunucu" ortamında çalışmaya meyilli olduğu anlamına gelir.
Tempo

1
Ubuntu 14.04'te bu API, ifconfig yalnızca istediğim bir arabirimi (genel olarak erişilebilen ip adresi) ve geri döngü (127.0.0.1) bildirmesine rağmen 127.0.1.1 değerini döndürür. Farklı bir geridönüş takma adı döndürmesi garip.
ctpenrose

Bir use getLocalHost().getHostAddress()şey yayınlarsanız 0.0.0.0, ağdaki noter bir bilgisayardan bakarken görebileceğinizi ekleyeceğim . Bu burada açıklanır İki bilgisayar arasında Gazebo kullanırken bu oldu
Peter Mitrano

57

Burada gönderilen IP belirsizliği geçici çözüm kodunu https://issues.apache.org/jira/browse/JCS-40 (Linux sistemlerinde belirsiz) InetAddress.getLocalHost () den gönderdi :

/**
 * 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
Ev sahibinin birden fazla benzer ağ arayüzüne sahip olması durumunda bu durumun yine de çözülmediğine dikkat edilmelidir.
Vadzim

1
feryat yanıtı daha iyidir - stackoverflow.com/questions/9481865/… Varsayılan Gatway için src olarak kullanılan yerel ip adresini alır
Radu Toader

Neden ip adresi eğik çizgi ile eklenir ..? /10.39.0.17 ..? gibi, her zaman bu şekilde kesilmelidir ..?
Kanagavelu Sugumar

51

Sen java'nın kullanabilirsiniz InetAddress bu amaçla sınıf.

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

Sistemim için çıktı = IP of my system is := 10.100.98.228

getHostAddress () döner

Metin sunumunda IP adresi dizesini döndürür.

VEYA ayrıca yapabilirsiniz

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

Çıktı = IP of my system is := RanRag-PC/10.100.98.228


9
10.xxx'in, sisteminizin bir NAT ağında olduğunu belirten özel bir adres olduğunu unutmayın. Dış dünyayla iletişim kurarken farklı bir adres olarak görünecektir. Harici IP adresine gerçekten ihtiyacınız varsa, geldiğiniz IP adresini size yansıtacak birçok siteden birine başvurmanız gerekir. Bu sizin için yararlı olabilir veya olmayabilir. Hiçbir durumda sisteminize dışarıdan neredeyse hiç ulaşılamaz.
Edward Falk

19

"Yerel" adresinizi ararken, her makinenin yalnızca tek bir ağ arabirimi olmadığını ve her arabirimin kendi yerel adresi olabileceğini unutmayın. Bu, makinenizin her zaman birkaç "yerel" adrese sahip olduğu anlamına gelir.

Farklı uç noktalara bağlanırken kullanmak için otomatik olarak farklı "yerel" adresler seçilir. Örneğin, bağlandığınızda google.com"dış" bir yerel adres kullanıyorsunuz; ancak localhostadresinize bağlandığınızda yerel adresiniz her zamanlocalhost kendisidir, çünkü localhost sadece bir geri döngüdür.

Aşağıda, iletişim kurarken yerel adresinizi nasıl bulacağınız gösterilmektedir google.com:

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

Müthiş !! - çok kolay :)
smilyface

4
sonuna socket.close () ekle :)
MC

11

Scala örneği (sbt dosyasında yararlıdır):

  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

DÜZENLEME 1: Güncellenmiş kod, önceki bağlantıdan bu yana artık yok

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

GERÇEK SÜRÜM: Bu çalışmayı durdurdu

Umarım bu pasaj bunu başarmanıza yardımcı olabilir:

// 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
Eğer her zaman internete bağlıysanız, umarım çözüm işe yarar, ama bunu garanti etmiyorum. Ayrıca, sistem internete bağlı olmadığında ve daha sonra sistemin LAN IP adresini, aksi takdirde localhost döndürmek gerekir. Bu yüzden benim için uygun bir seçenek değil. Başka bir yol ??
sasidhar

@sasidhar: İnternete bağlandığınızda, ancak o zaman genel IP'nizi alıyorsunuz sanırım, eğer bağlı değilseniz, bu yöntem size, yerel IP veya LAN IP'nizi ve sizin belirttiğiniz gibi son koşulu verecektir Hata döndürmek yerine "127.0.0.1" döndürebilirsiniz.
Güzel

1
Yaklaşımınızı seviyorum ama bu bağlantı artık çalışmıyor gibi görünüyor !! Bu harici bağlantı yerine çalışmak için kendi sistemime bir denetleyici koyabilir miyim ve bu yüzden daha güvenilir olabilir miyim ???
azerafati

1
@Bludream: Bunu bildiğime getirdiğin için çok teşekkür ederim, bağlantı artık çalışmıyor. Gönderiyi bazı yeni girdilerle güncelledim. Umarım kullanıcı çantanız için çalışır. Sorunuzla ilgili olarak, çalışmasını sağlamak için kendi sisteminize bir denetleyici nasıl kuracağınızı gerçekten bilmiyorum. Bu yüzden bu konu hakkında bilgi veremeyeceğim, MY BAD. Tekrar teşekkürler ve GÜLÜMSEME TUTUN :-)
güzel C27

1
Bu harika bir çözüm olduğu kadar, son derece güvenilmezdir. Ana iş parçacığını (diyelim) engellemiş olsaydınız ve herhangi bir nedenden ötürü herhangi bir whatismyip.comsüre için kapatılmış olsaydı, uygulamanız da kapanırdı :(. Ya da çöp verilerini döndürür ve beklenmedik davranışlara neden olur. en IP adresi tespit whatismyip.commakinesinin, mutlaka ip adresi kullandığınız.
Decoded

6

önce sınıfı içe aktar

import java.net.InetAddress;

sınıfta

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

2
kullanımda olmasa bile sadece ilk ip adresini verir!
Yahya

6

java.net.InetAddressAPI kullanabilirsiniz . Bunu dene :

InetAddress.getLocalHost().getHostAddress();

5
sadece 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
lütfen kodunuzun ne yaptığına dair bir açıklama ekleyin.
HCarrasko

4

Bu, yukarıdaki KABUL EDİLMİŞ cevabın çalışan bir örneğidir! Bu NetIdentity sınıfı, hem yerel ana bilgisayar ip'ini hem de yerel geri dönüşü depolar. Yukarıda belirtildiği gibi DNS tabanlı bir sunucudaysanız, biraz daha kontrol eklemeniz veya Yapılandırma Dosyası Yolu'na gitmeniz gerekebilir.

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

Bu kodu çalıştırdığımda aslında böyle bir çıktı almak:

    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

Benim kullanımım için bir Upnp sunucusu kuruyorum, aradığım 'kalıbı' anlamaya yardımcı oldu. Döndürülen nesnelerin bazıları Ethernet Bağdaştırıcıları, Ağ Bağdaştırıcıları, Sanal Ağ Bağdaştırıcıları, Sürücüler ve VPN İstemci Bağdaştırıcılarıdır. Her şeyin bir Adresi yoktur. Böylece, olmayan arayüz nesnelerini atlamak isteyeceksiniz.

Bunu akım için döngüye de ekleyebilirsiniz 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());
}

Ve çıktılarınızdaki bilgileri şöyle göreceksiniz:

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

Yerel adresi almak için InetAddress.getLocalHost () yöntemini kullanın

import java.net.InetAddress;

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

PPP Bağlantı IP adresim: 117.204.44.192 Ama yukarıda bana 192.168.1.2
sasidhar

Mevcut tüm InetAddress örneklerini taramanız ve hangisinin uygun olduğunu bulmanız gerekir.
Dekoder

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

Çalışıyor gibi görünen oldukça basit bir yaklaşım ...

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

Makineniz bir ağın parçasıysa, ağınızın IP adresini alır

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

0

Genellikle cmyip.com veya www.iplocation.net gibi genel IP Adresimi bulmaya çalıştığımda , bu şekilde kullanıyorum:

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

Sistemim (diğer pek çok sistem gibi) çeşitli ağ arayüzlerine sahip olduğundan. InetAddress.getLocalHost()veya Inet4Address.getLocalHost()basitçe arzu etmediğim bir tanesini geri verdim. Bu yüzden bu naif yaklaşımı kullanmak zorunda kaldım.

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.

Bu yaklaşımda, istenen IP adresimin 192.168.2alt ağda olduğunu bildiğime dikkat edin .


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

lütfen kodunuzun ne yaptığına dair bir açıklama ekleyin.
HCarrasko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.