Lấy địa chỉ IP của máy hiện tại bằng Java


291

Tôi đang cố gắng phát triển một hệ thống trong đó có các nút khác nhau được chạy trên hệ thống khác nhau hoặc trên các cổng khác nhau trên cùng một hệ thống.

Bây giờ tất cả các nút tạo một Ổ cắm với IP đích là IP của một nút đặc biệt được gọi là nút bootstrapping. Các nút sau đó tự tạo ServerSocketvà bắt đầu lắng nghe các kết nối.

Nút bootstrapping duy trì một danh sách các Nút và trả về chúng khi được truy vấn.

Bây giờ cái tôi cần là nút phải đăng ký IP của nó cho nút bootstrapping. Tôi đã thử sử dụng cli.getInetAddress()một khi máy khách kết nối với ServerSocketnút bootstrapping nhưng không được.

  1. Tôi cần khách hàng đăng ký IP PPP nếu có;
  2. Nếu không thì IP LAN nếu có;
  3. Nếu không, nó phải đăng ký 127.0.0.1 giả sử cùng một máy tính.

Sử dụng mã:

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

hoặc là

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

Địa chỉ IP kết nối PPP của tôi là: 117.204.44.192 nhưng ở trên trả về cho tôi 192.168.1.2

BIÊN TẬP

Tôi đang sử dụng đoạn mã sau:

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ôi có thể nhận được tất cả các địa chỉ IP được liên kết với tất cả các NetworkInterfaces, nhưng làm cách nào để phân biệt chúng? Đây là đầu ra tôi đang nhận được:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalhost () sẽ hoạt động đúng không?
Sears Ấn Độ

3
Trong vòng lặp nếu tôi thêm n.isPointToPoint () thì nó có hoạt động không ?? Ý tưởng của tôi là trả về "127.0.0.1" nếu không tìm thấy mạng Point to Point. Công việc vừa ý??
sasidhar

3
@sasidhar: Vui lòng không đăng địa chỉ IP chính hãng của bạn. hãy viết 117.xxx.xxx.xxx, đối với IP riêng thì không sao.
Tôi xin chào

@GagandeepBali Cảm ơn lời khuyên nhưng IP của tôi là IP động và tôi nhận được IP mới mỗi lần tôi ngắt kết nối và kết nối internet. Vì vậy, không nên là một vấn đề, tôi đoán.
sasidhar

Câu trả lời:


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

Cách này hoạt động tốt khi có nhiều giao diện mạng. Nó luôn trả về IP gửi đi ưa thích. Đích đến8.8.8.8 là không cần thiết để có thể đạt được.

Connecttrên ổ cắm UDP có tác dụng như sau: nó đặt đích cho Send / Recv, loại bỏ tất cả các gói từ các địa chỉ khác và - đó là những gì chúng ta sử dụng - chuyển ổ cắm sang trạng thái "được kết nối", cài đặt các trường thích hợp. Điều này bao gồm kiểm tra sự tồn tại của tuyến đến đích theo bảng định tuyến của hệ thống và đặt điểm cuối cục bộ tương ứng. Phần cuối dường như không có giấy tờ chính thức nhưng có vẻ như là một đặc điểm không thể thiếu của API ổ cắm Berkeley (tác dụng phụ của trạng thái "được kết nối" UDP) hoạt động đáng tin cậy trong cả Windows và Linux trên các phiên bản và phân phối.

Vì vậy, phương pháp này sẽ cung cấp địa chỉ cục bộ sẽ được sử dụng để kết nối với máy chủ từ xa được chỉ định. Không có kết nối thực sự được thiết lập, do đó ip từ xa được chỉ định có thể không truy cập được.

Biên tập:

Như @macomgil nói, đối với MacOS, bạn có thể làm điều này:

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

7
Nó hoạt động với tôi trên linux nhưng trên OsX tôi nhận được: "0.0.0.0"
Radu Toader

@Jeef, câu trả lời được cập nhật. Nếu nó không hoạt động trên OsX, thì bạn cần chọn một cách khác.
Mr.Wang từ Next Door

1
Xuất sắc! FYI, khi giao dịch với mạng bên trong khép kín, chỉ cần thay thế 8.8.8.8 bằng thứ gì đó mà mọi máy chủ có thể tiếp cận
Murphy Ng

Hoạt động trên Windows; chúng tôi có thể xác nhận nếu OSX vẫn là một vấn đề?
bộ ba

4
@trilogy Tôi vẫn nhận được 0.0.0.0 trên OSX
Peter Tutervai

273

Điều này có thể là một chút khó khăn trong trường hợp chung nhất.

Trên mặt của nó, InetAddress.getLocalHost() sẽ cung cấp cho bạn địa chỉ IP của máy chủ này. Vấn đề là một máy chủ có thể có nhiều giao diện mạng và giao diện có thể bị ràng buộc với nhiều hơn một địa chỉ IP. Và trên hết, không phải tất cả các địa chỉ IP sẽ có thể truy cập được bên ngoài máy hoặc mạng LAN của bạn. Ví dụ: chúng có thể là địa chỉ IP cho các thiết bị mạng ảo, địa chỉ IP mạng riêng, v.v.

Điều này có nghĩa là địa chỉ IP được trả về bởi InetAddress.getLocalHost() có thể không phải là địa chỉ phù hợp để sử dụng.

Làm thế nào bạn có thể đối phó với điều này?

  • Một cách tiếp cận là sử dụng NetworkInterface.getNetworkInterfaces()để có được tất cả các giao diện mạng đã biết trên máy chủ và sau đó lặp lại qua từng địa chỉ của NI.
  • Một cách tiếp cận khác là (bằng cách nào đó) lấy FQDN được quảng cáo bên ngoài cho máy chủ và sử dụng InetAddress.getByName()để tra cứu địa chỉ IP chính. (Nhưng làm thế nào để bạn có được nó và làm thế nào để bạn đối phó với bộ cân bằng tải dựa trên DNS?)
  • Một biến thể của trước đó là lấy FQDN ưa thích từ tệp cấu hình hoặc tham số dòng lệnh.
  • Một biến thể khác là lấy địa chỉ IP ưa thích từ tệp cấu hình hoặc tham số dòng lệnh.

Tóm lại, InetAddress.getLocalHost()thông thường sẽ hoạt động, nhưng bạn có thể cần cung cấp một phương pháp thay thế cho các trường hợp mã của bạn được chạy trong một môi trường có kết nối mạng "phức tạp".


Tôi có thể nhận được tất cả các địa chỉ IP được liên kết với tất cả các Giao diện mạng, nhưng làm cách nào để phân biệt chúng?

  • Bất kỳ địa chỉ nào trong phạm vi 127.xxx.xxx.xxx là địa chỉ "loopback". Nó chỉ hiển thị với máy chủ "này".
  • Bất kỳ địa chỉ nào trong phạm vi 192.168.xxx.xxx là địa chỉ IP riêng (còn gọi là trang web cục bộ). Chúng được dành riêng để sử dụng trong một tổ chức. Điều tương tự cũng áp dụng cho các địa chỉ 10.xxx.xxx.xxx và 172.16.xxx.xxx đến 172.31.xxx.xxx.
  • Địa chỉ trong phạm vi 169.254.xxx.xxx là liên kết địa chỉ IP cục bộ. Chúng được dành riêng để sử dụng trên một phân đoạn mạng duy nhất.
  • Địa chỉ trong phạm vi 224.xxx.xxx.xxx đến 239.xxx.xxx.xxx là địa chỉ multicast.
  • Địa chỉ 255.255.255.255 là địa chỉ quảng bá.
  • Bất cứ điều gì khác phải là một địa chỉ IPv4 điểm-điểm công cộng hợp lệ.

Trên thực tế, API InetAddress cung cấp các phương pháp để kiểm tra loopback, liên kết cục bộ, địa phương trang web, phát đa hướng và địa chỉ quảng bá. Bạn có thể sử dụng chúng để sắp xếp địa chỉ IP nào bạn nhận được là phù hợp nhất.


3
Trong trường hợp bất kỳ ai cũng tò mò, về cơ bản getLocalhost sẽ tìm kiếm DNS trên tên máy chủ của máy chủ. Nếu nó nhận được một địa chỉ IP từ tra cứu đó thì nó sẽ tìm kiếm thông qua các giao diện có sẵn để xem giao diện nào có địa chỉ IP đó và nó trả về giao diện đó. Điều này có nghĩa là getLocalhost sẽ có xu hướng hoạt động trong môi trường "máy chủ" trong đó IP gửi đi là địa chỉ ánh xạ tới tên máy chủ của máy chủ.
Pace

1
Trên Ubuntu 14.04, api này trả về 127.0.1.1 mặc dù ifconfig chỉ báo cáo hai giao diện, giao diện tôi muốn (địa chỉ IP có thể truy cập công khai) và loopback (127.0.0.1). Thật kỳ lạ khi nó trả về một bí danh loopback khác.
ctpenrose

Tôi sẽ thêm rằng nếu bạn use getLocalHost().getHostAddress()xuất bản một cái gì đó, bạn có thể thấy 0.0.0.0khi nhìn từ một máy tính mới trên mạng. Điều này được giải thích ở đây Đây là những gì đã xảy ra với tôi khi tôi đang sử dụng Gazebo trên hai máy tính
Peter Mitrano

57

Đăng ở đây đã kiểm tra mã giải pháp mơ hồ IP từ https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalhost () mơ hồ trên các hệ thống 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
Cần lưu ý rằng điều này vẫn không giải quyết được ambuguity trong trường hợp máy chủ lưu trữ có nhiều giao diện nerwork tương tự.
Vadzim

1
câu trả lời dưới đây là tốt hơn - stackoverflow.com/questions/9481865/ giết lấy địa chỉ IP cục bộ được sử dụng làm src cho Mặc định Gatway
Radu Toader

Tại sao địa chỉ IP được thêm bằng dấu gạch chéo phía trước ..? như /10,39.0,17 ..?, Có phải luôn luôn theo cách này nên được cắt bớt ..?
Kanagavelu Sugumar

51

Bạn có thể sử dụng lớp InetAddress của java cho mục đích này.

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

Đầu ra cho hệ thống của tôi = IP of my system is := 10.100.98.228

trả về gethostAddress ()

Trả về chuỗi địa chỉ IP trong bản trình bày văn bản.

HOẶC bạn cũng có thể làm

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

Đầu ra = IP of my system is := RanRag-PC/10.100.98.228


9
Lưu ý rằng 10.xxx là một địa chỉ riêng, cho biết hệ thống của bạn nằm trên mạng NAT. Nó sẽ xuất hiện dưới dạng một địa chỉ khác khi liên hệ với thế giới bên ngoài. Nếu bạn thực sự cần địa chỉ IP bên ngoài, bạn sẽ phải liên hệ với một trong nhiều trang web sẽ phản hồi lại cho bạn địa chỉ IP bạn đến từ đó. Điều này có thể hoặc có thể không hữu ích cho bạn. Hệ thống của bạn gần như chắc chắn sẽ không thể truy cập từ bên ngoài trong bất kỳ sự kiện nào.
Edward Falk

19

Khi bạn đang tìm kiếm địa chỉ "cục bộ" của mình, bạn nên lưu ý rằng mỗi máy không chỉ có một giao diện mạng duy nhất và mỗi giao diện có thể có địa chỉ cục bộ riêng. Điều đó có nghĩa là máy của bạn luôn sở hữu một số địa chỉ "cục bộ".

Các địa chỉ "cục bộ" khác nhau sẽ được chọn tự động để sử dụng khi bạn kết nối với các điểm cuối khác nhau. Ví dụ: khi bạn kết nối với google.com, bạn đang sử dụng địa chỉ cục bộ "bên ngoài"; nhưng khi bạn kết nối với localhost, địa chỉ địa phương của bạn luôn luônlocalhost chính nó, bởi vì localhost chỉ là một loopback.

Dưới đây là hướng dẫn cách tìm ra địa chỉ địa phương của bạn khi bạn liên lạc với google.com:

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

Tuyệt vời !! - thật dễ dàng :)
smilyface

4
thêm socket.close () vào cuối :)
MC

11

Ví dụ trong scala (hữu ích trong tệp 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: Mã được cập nhật, kể từ liên kết trước, không còn tồn tại

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

PHIÊN BẢN THỰC TẾ: Điều này đã ngừng hoạt động

Hy vọng đoạn trích này có thể giúp bạn đạt được điều này:

// 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
Giải pháp sẽ hiệu quả, hy vọng nếu tôi luôn kết nối với internet, nhưng tôi không đảm bảo điều đó. Bên cạnh đó, khi hệ thống không được kết nối với internet và sau đó tôi cần trả lại địa chỉ IP LAN của hệ thống nếu có, nếu không thì localhost. Vì vậy, không phải là một lựa chọn khả thi cho tôi. Bất kỳ cách nào khác??
sasidhar

@sasidhar: Khi bạn được kết nối với Internet, chỉ khi đó bạn mới có IP công cộng, tôi đoán, nếu bạn không được kết nối thì phương pháp này sẽ cung cấp cho bạn, IP cục bộ hoặc IP LAN của bạn và cho điều kiện cuối cùng theo chỉ định của bạn bạn có thể trả về "127.0.0.1", thay vì trả về Lỗi.
ncc cOw

1
Tôi thích cách tiếp cận của bạn nhưng liên kết đó dường như không hoạt động nữa !! Tôi có thể đặt một bộ điều khiển trên hệ thống của riêng tôi để hoạt động thay vì liên kết bên ngoài đó và vì vậy đáng tin cậy hơn ???
azerafati

1
@Bludream: Cảm ơn bạn rất nhiều, vì đã mang điều này đến với kiến ​​thức của tôi, rằng liên kết không còn hoạt động nữa. Tôi đã cập nhật bài viết, với một số đầu vào mới. Hy vọng nó hoạt động cho usercase của bạn. Về câu hỏi của bạn, tôi thực sự không biết, làm thế nào để thiết lập bộ điều khiển trên hệ thống của riêng bạn để làm cho nó hoạt động. Vì vậy, tôi sẽ không thể đưa ra cái nhìn sâu sắc về chủ đề này, MY BAD. Cảm ơn một lần nữa và GIỮ
SMILING

1
Nhiều như đây là một giải pháp tuyệt vời, Nó cực kỳ không đáng tin cậy. Nếu bạn chặn luồng chính (giả sử) và vì bất kỳ lý do gì whatismyip.comđã ngừng hoạt động trong một khoảng thời gian, ứng dụng của bạn cũng sẽ ngừng hoạt động :(. Hoặc nó sẽ trả lại dữ liệu rác và gây ra hành vi không mong muốn. hầu hết địa chỉ IP có thể được phát hiện bởi whatismyip.com, không nhất thiết phải là địa chỉ IP của máy bạn đang sử dụng.
Giải mã

6

trước hết là nhập lớp

import java.net.InetAddress;

Trong lớp

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

2
nó chỉ cung cấp địa chỉ IP đầu tiên ngay cả khi nó không phải là địa chỉ đang sử dụng!
Yahya

6

Bạn có thể sử dụng java.net.InetAddressAPI. Thử cái này :

InetAddress.getLocalHost().getHostAddress();

5
nó sẽ trả về 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
xin vui lòng, xem xét thêm một số giải thích về những gì mã của bạn làm.
HCarrasko

4

Đây là một ví dụ hoạt động của câu trả lời CHẤP NHẬN ở trên! Lớp NetIdentity này sẽ lưu trữ cả ip máy chủ nội bộ, cũng như loopback cục bộ. Nếu bạn đang sử dụng máy chủ dựa trên DNS, như đã đề cập ở trên, bạn có thể cần thêm một số kiểm tra khác hoặc có thể đi Tuyến đường tệp cấu hình.

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

Khi tôi chạy mã này, tôi thực sự nhận được một bản in như thế này:

    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

Để sử dụng, tôi đang thiết lập Máy chủ Upnp, nó giúp hiểu được 'mẫu' mà tôi đang tìm kiếm. Một số đối tượng được trả về là Bộ điều hợp Ethernet, Bộ điều hợp mạng, Bộ điều hợp mạng ảo, Trình điều khiển và Bộ điều hợp máy khách VPN. Không phải cái gì cũng có Địa chỉ. Vì vậy, bạn sẽ muốn bỏ qua các đối tượng giao diện không.

Bạn cũng có thể thêm nó vào vòng lặp cho hiện tại 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());
}

Và bạn sẽ thấy thông tin trong đầu ra của bạn giống như thế này:

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

Sử dụng InetAddress.getLocalhost () để lấy địa chỉ cục bộ

import java.net.InetAddress;

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

Địa chỉ IP kết nối PPP của tôi là: 117.204.44.192 Nhưng ở trên trả về cho tôi 192.168.1.2
sasidhar

Bạn cần thu thập dữ liệu tất cả các phiên bản InetAddress có sẵn và tìm ra trường hợp nào là đúng.
Giải mã

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

Một cách tiếp cận khá đơn giản dường như đang hoạt động ...

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

Điều này nhận được địa chỉ IP của mạng của bạn nếu máy của bạn là một phần của mạng

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

0

Thông thường khi tôi cố gắng tìm Địa chỉ IP công cộng của mình như cmyip.com hoặc www.iplocation.net , tôi sử dụng cách này:

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

Vì hệ thống của tôi (giống như rất nhiều hệ thống khác) có nhiều giao diện mạng khác nhau. InetAddress.getLocalHost()hoặc Inet4Address.getLocalHost()đơn giản là trả lại một cái mà tôi không mong muốn. Do đó tôi đã phải sử dụng phương pháp ngây thơ này.

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.

Chỉ cần cẩn thận rằng trong phương pháp này tôi đã biết rằng địa chỉ IP mong muốn của tôi nằm trong 192.168.2mạng con.


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

xin vui lòng, thêm một số giải thích về những gì mã của bạn làm.
HCarrasko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.