Java를 사용하여 현재 머신의 IP 주소 얻기


291

다른 시스템 또는 동일한 시스템의 다른 포트에서 실행되는 다른 노드가있는 시스템을 개발하려고합니다.

이제 모든 노드는 부트 스트랩 노드라고하는 특수 노드의 IP로 대상 IP를 가진 소켓을 만듭니다. 그런 다음 노드는 자체적으로 작성하여 ServerSocket연결 청취를 시작합니다.

부트 스트랩 노드는 노드 목록을 유지 보수하고 조회시 리턴합니다.

이제 필요한 것은 노드가 부트 스트랩 노드에 IP를 등록해야한다는 것입니다. cli.getInetAddress()클라이언트 ServerSocket가 부트 스트랩 노드에 연결하면 사용 했지만 작동하지 않았습니다.

  1. 가능한 경우 클라이언트가 PPP IP를 등록해야합니다.
  2. 그렇지 않으면 LAN IP (사용 가능한 경우);
  3. 그렇지 않으면 동일한 컴퓨터를 가정하여 127.0.0.1을 등록해야합니다.

코드 사용하기 :

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

또는

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

내 PPP 연결 IP 주소는 117.204.44.192이지만 위의 내용은 192.168.1.2입니다.

편집하다

다음 코드를 사용하고 있습니다.

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

모든 IP 주소를 모두 가져올 수 NetworkInterface있지만 어떻게 구별합니까? 이것은 내가 얻는 결과입니다.

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalHost ()가 제대로 작동합니까?
시어스 인디아

3
루프 내부에 n.isPointToPoint ()를 추가하면 작동합니까 ?? Point to Point 네트워크가 없으면 "127.0.0.1"을 반환하는 것이 좋습니다. 작동할까요?
sasidhar

3
@sasidhar : 진짜 IP 주소를 게시하지 마십시오. 개인 IP에 대해서는 117.xxx.xxx.xxx를 쓰십시오.
nIcE cOw

@GagandeepBali 조언을 주셔서 감사하지만 내 IP는 동적 IP이며 인터넷 연결을 끊고 연결할 때마다 새 IP를 얻습니다. 따라서 문제가되지 않아야합니다.
sasidhar

답변:


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

이 방법은 여러 네트워크 인터페이스가있을 때 잘 작동합니다. 항상 선호하는 아웃 바운드 IP를 반환합니다. 목적지 8.8.8.8에 도달 할 필요는 없습니다.

ConnectUDP 소켓에서 다음과 같은 효과가 있습니다. Send / Recv의 대상을 설정하고 다른 주소에서 모든 패킷을 버리고 사용하는 소켓을 "연결된"상태로 전송하여 해당 필드를 설정합니다. 여기에는 시스템의 라우팅 테이블에 따라 대상에 대한 경로가 있는지 확인하고 이에 따라 로컬 엔드 포인트를 설정하는 것이 포함됩니다. 마지막 부분은 공식적으로 문서화되지 않은 것으로 보이지만 버전과 배포판에서 Windows와 Linux 모두에서 안정적으로 작동하는 Berkeley 소켓 API (UDP "연결된"상태의 부작용)의 핵심적인 특성처럼 보입니다.

따라서이 방법은 지정된 원격 호스트에 연결하는 데 사용되는 로컬 주소를 제공합니다. 실제 연결이 설정되지 않았으므로 지정된 원격 IP에 도달 할 수 없습니다.

편집하다:

으로 @macomgil는 말한다, 맥 OS 당신은이 작업을 수행 할 수 있습니다

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

7
그것은 리눅스에 나를 위해 일하지만, OSX에 내가 얻을 : "0.0.0.0"
라두 Toader을

@Jeef, 답변이 업데이트되었습니다. OsX에서 작동하지 않으면 다른 방법을 선택해야합니다.
Next Door에서 Mr.Wang

1
훌륭한! 참고로 폐쇄 내부 네트워크를 다룰 때 8.8.8.8을 모든 호스트가 도달 할 수있는 것으로 대체하십시오
Murphy Ng

Windows에서 작동합니다. OSX가 여전히 문제인지 확인할 수 있습니까?
trilogy

4
@trilogy 난 여전히 OSX에서 0.0.0.0을 받고 있어요
Peter Tutervai

273

가장 일반적인 경우에는 약간 까다로울 수 있습니다.

그것의 얼굴에, InetAddress.getLocalHost()당신 에게이 호스트의 IP 주소를 제공해야합니다. 문제는 호스트에 많은 네트워크 인터페이스가있을 수 있고 인터페이스가 둘 이상의 IP 주소에 바인딩 될 수 있다는 것입니다. 또한 모든 IP 주소가 컴퓨터 나 LAN 외부에 도달 할 수있는 것은 아닙니다. 예를 들어 가상 네트워크 장치의 IP 주소, 개인 네트워크 IP 주소 등이 될 수 있습니다.

이것이 의미하는 것은 반환 된 IP 주소 InetAddress.getLocalHost()가 사용하기에 적합하지 않을 수 있다는 것입니다.

이것을 어떻게 다룰 수 있습니까?

  • 한 가지 방법은 NetworkInterface.getNetworkInterfaces()호스트에서 알려진 모든 네트워크 인터페이스를 얻은 다음 각 NI의 주소를 반복하는 것입니다.
  • 또 다른 방법은 호스트에 대해 외부 적으로 보급 된 FQDN을 가져 InetAddress.getByName()와서 기본 IP 주소를 찾는 데 사용 하는 것입니다. (그러나 어떻게 구할 수 있으며 DNS 기반로드 밸런서를 어떻게 처리합니까?)
  • 이전의 변형은 구성 파일 또는 명령 줄 매개 변수에서 기본 FQDN을 가져 오는 것입니다.
  • 또 다른 변형은 구성 파일 또는 명령 줄 매개 변수에서 기본 IP 주소를 얻는 것입니다.

요약 InetAddress.getLocalHost()하면 일반적으로 작동하지만 "복잡한"네트워킹 환경에서 코드가 실행되는 경우 대체 방법을 제공해야 할 수도 있습니다.


모든 네트워크 인터페이스와 관련된 모든 IP 주소를 얻을 수 있지만 어떻게 구별합니까?

  • 127.xxx.xxx.xxx 범위의 모든 주소는 "루프백"주소입니다. "이"호스트 만 볼 수 있습니다.
  • 192.168.xxx.xxx 범위의 모든 주소는 개인 (일명 사이트 로컬) IP 주소입니다. 이들은 조직 내에서 사용하도록 예약되어 있습니다. 10.xxx.xxx.xxx 주소와 172.16.xxx.xxx부터 172.31.xxx.xxx까지 동일하게 적용됩니다.
  • 169.254.xxx.xxx 범위의 주소는 링크 로컬 IP 주소입니다. 이들은 단일 네트워크 세그먼트에서 사용하도록 예약되어 있습니다.
  • 224.xxx.xxx.xxx ~ 239.xxx.xxx.xxx 범위의 주소는 멀티 캐스트 주소입니다.
  • 주소 255.255.255.255는 브로드 캐스트 주소입니다.
  • 다른 것은 유효한 공개 지점 간 IPv4 주소 여야 합니다.

실제로 InetAddress API는 루프백, 링크 로컬, 사이트 로컬, 멀티 캐스트 및 브로드 캐스트 주소 테스트를위한 메소드를 제공합니다. 이 정보를 사용하여 가장 적합한 IP 주소를 정렬 할 수 있습니다.


3
궁금한 사람이있는 경우 getLocalHost는 기본적으로 서버의 호스트 이름에서 DNS 조회를 수행합니다. 해당 조회에서 IP 주소를 가져 오면 사용 가능한 인터페이스를 검색하여 해당 인터페이스에 해당 IP 주소가있는 인터페이스를 찾아 해당 인터페이스를 반환합니다. 즉, getLocalHost는 발신 IP가 서버의 호스트 이름에 매핑되는 "서버"환경에서 작동하는 경향이 있습니다.
페이스

1
우분투 14.04 에서이 API는 ifconfig가 원하는 인터페이스 (공개적으로 액세스 가능한 IP 주소)와 루프백 (127.0.0.1)의 두 가지 인터페이스 만보 고하더라도 127.0.1.1을 반환합니다. 다른 루프백 별칭을 반환한다는 것이 이상합니다.
ctpenrose

나는 당신이 경우에 것을 추가 할 것입니다 use getLocalHost().getHostAddress()뭔가를 게시, 당신이 볼 수 0.0.0.0네트워크에있는 사람 같아 컴퓨터에서 볼 때. 여기에 설명되어 있습니다. 제가 두 대의 컴퓨터에서 Gazebo 를 사용할 때 일어난 일입니다
Peter Mitrano

57

여기에 https://issues.apache.org/jira/browse/JCS-40의 IP 모호한 해결 방법 코드를 게시하면 (Linux 시스템에서는 InetAddress.getLocalHost ()가 모호합니다) :

/**
 * 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
호스트가 여러 개의 유사한 nerwork 인터페이스를 가지고있는 경우에도이 방법으로 모호성을 해결할 수는 없습니다.
Vadzim

1
벨로우즈의 대답은 더 나은 - stackoverflow.com/questions/9481865/...은 기본 Gatway에 대한 SRC로 사용되는 로컬 IP 주소를 얻는다
라두 Toader

왜 IP 주소가 슬래시로 추가됩니까? /10.39.0.17 ..?와 같이 항상 이런 식으로 트림해야합니까
Kanagavelu Sugumar

51

이 목적으로 java의 InetAddress 클래스를 사용할 수 있습니다 .

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

내 시스템의 출력 = IP of my system is := 10.100.98.228

getHostAddress () 는 다음을 리턴합니다.

텍스트 표현으로 IP 주소 문자열을 반환합니다.

또는 당신은 또한 할 수 있습니다

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

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


9
10.xxx는 개인 주소이며 시스템이 NAT 네트워크에 있음을 나타냅니다. 외부 세계에 연락 할 때 다른 주소로 표시됩니다. 외부 IP 주소가 정말로 필요한 경우, 여러 사이트 중 하나에 연결해야합니다.이 사이트는 사용자가 오는 IP 주소를 다시 알려줍니다. 이것은 당신에게 유용 할 수도 있고 아닐 수도 있습니다. 어떤 경우에도 시스템은 외부에서 거의 도달 할 수 없습니다.
Edward Falk

19

"로컬"주소를 찾을 때 각 컴퓨터에는 단일 네트워크 인터페이스가있을뿐 아니라 각 인터페이스에는 고유 한 로컬 주소가있을 수 있습니다. 이것은 컴퓨터가 항상 여러 "로컬"주소를 소유하고 있음을 의미합니다.

다른 엔드 포인트에 연결할 때 사용할 다른 "로컬"주소가 자동으로 선택됩니다. 예를 들어에 연결할 때 google.com"외부"로컬 주소를 사용하고 있습니다. 그러나에 연결하면 localhost는 루프백이므로 localhost로컬 주소는 항상 localhost자체입니다.

아래는 통신 할 때 지역 주소를 찾는 방법을 보여줍니다 google.com.

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

대박 !!
-so

4
마지막에 socket.close () 추가 :)
MC

11

scala의 예 (sbt 파일에 유용) :

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

  def getIpAddress: String = {

    val enumeration = NetworkInterface.getNetworkInterfaces.asScala.toSeq

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

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

    address.getHostAddress
  }

10

편집 1 : 이전 링크 이후 업데이트 된 코드가 더 이상 존재하지 않습니다.

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

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

실제 버전 : 작동이 중지되었습니다

이 스 니펫이이를 달성하는 데 도움이되기를 바랍니다.

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

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

2
해결책은 항상 인터넷에 연결되어 있다면 잘 작동하지만 보장되지는 않습니다. 또한 시스템이 인터넷에 연결되어 있지 않은 경우 시스템의 LAN IP 주소가 있으면 로컬 호스트를 반환해야합니다. 그래서 나에게는 가능한 옵션이 아닙니다. 다른 방법 ??
sasidhar

@sasidhar : 인터넷에 연결되어있을 때만 공개 IP를 가지고 있다고 생각합니다. 연결되어 있지 않으면이 방법으로 로컬 IP 또는 LAN IP를 제공하고 마지막 조건을 지정합니다 Error를 반환하는 대신 "127.0.0.1"을 반환 할 수 있습니다.
nIcE cOw

1
나는 당신의 접근 방식을 좋아하지만 그 연결은 더 이상 작동하지 않는 것 같습니다! 외부 링크 대신 작동하도록 자체 시스템에 컨트롤러를 배치하여 더 안정적 일 수 있습니까 ???
azerafati

1
@ Bludream : 내 지식을 가져 와서 링크가 더 이상 작동하지 않도록 주셔서 감사합니다. 새로운 입력으로 게시물을 업데이트했습니다. 잘하면 그것은 당신의 사용자 사례에 작동합니다. 귀하의 질문에 관해서는, 실제로 자신의 시스템에 컨트롤러를 설정하여 작동시키는 방법을 모르겠습니다. 따라서이 주제 인 MY BAD에 대한 통찰력을 얻을 수 없습니다. 다시 한 번 감사드립니다. 계속
웃으세요

1
이것이 멋진 해결책 인 한, 그것은 매우 신뢰할 수 없습니다. 메인 스레드를 차단하고 어떤 이유로 든 어떤 이유로 든 whatismyip.com다운 된 경우 앱도 다운됩니다. (또는 가비지 데이터를 반환하고 예기치 않은 동작이 발생합니다. 에 의해 대부분의 IP 주소 탐지 whatismyip.com기계, 반드시 IP 주소는 당신이 사용하고 있습니다.
디코딩 된

6

먼저 수업을 가져 오십시오

import java.net.InetAddress;

클래스

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

2
사용중인 IP 주소가 아닌 경우에도 첫 번째 IP 주소 만 제공합니다!
Yahya

6

java.net.InetAddressAPI 를 사용할 수 있습니다 . 이 시도 :

InetAddress.getLocalHost().getHostAddress();

5
127.0.0.1을 반환합니다
HCarrasko

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

1
코드의 기능에 대한 설명을 추가하십시오.
HCarrasko

4

위의 ACCEPTED 답변에 대한 실제 예입니다! 이 NetIdentity 클래스는 내부 호스트 ip와 로컬 루프백을 모두 저장합니다. 위에서 언급 한 것처럼 DNS 기반 서버를 사용하는 경우 검사를 더 추가하거나 구성 파일 경로로 이동해야 할 수 있습니다.

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

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

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

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

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

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

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

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


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

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

    public String getLoopbackHost(){
        return loopbackHost;
    }

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

이 코드를 실행하면 실제로 다음과 같이 인쇄됩니다.

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

내가 사용하기 위해 Upnp 서버를 설정하고 있는데, 내가 찾던 '패턴'을 이해하는 데 도움이되었습니다. 리턴 된 오브젝트 중 일부는 이더넷 어댑터, 네트워크 어댑터, 가상 네트워크 어댑터, 드라이버 및 VPN 클라이언트 어댑터입니다. 모든 것이 주소를 가지고있는 것은 아닙니다. 따라서 그렇지 않은 인터페이스 객체는 생략하고 싶을 것입니다.

이것을 현재의 루프에 추가 할 수도 있습니다 NetworkInterface i

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

그리고 다음과 같이 출력에 정보가 표시됩니다.

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

3

로컬 주소를 얻으려면 InetAddress.getLocalHost () 를 사용하십시오.

import java.net.InetAddress;

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

내 PPP 연결의 IP 주소 : 117.204.44.192 그러나 위의 반환 나에게 192.168.1.2
sasidhar

사용 가능한 모든 InetAddress 인스턴스를 크롤링하고 적절한 인스턴스를 찾아야합니다.
디코딩 된

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

public class IpAddress {

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

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

1

작동하는 것처럼 보이는 단순한 방법입니다.

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

        }
    }

    return ipToReturn;
}

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

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

1

컴퓨터가 네트워크의 일부인 경우 네트워크의 IP 주소를 얻습니다.

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

0

일반적으로 cmyip.com 또는 www.iplocation.net 과 같은 공용 IP 주소를 찾으려고 할 때 다음과 같이 사용합니다.

public static String myPublicIp() {

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

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

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

    return ipAdressDns ;
}

0

다른 시스템과 마찬가지로 내 시스템에는 다양한 네트워크 인터페이스가 있었기 때문에. InetAddress.getLocalHost()또는 Inet4Address.getLocalHost()내가 원하지 않는 것을 단순히 반환했습니다. 따라서 나는이 순진한 접근 방식을 사용해야했습니다.

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

이 접근 방식에서 원하는 IP 주소가 192.168.2서브넷에 있음을 이미 알고 있다는 점에 유의하십시오 .


-1
public static String getIpAddress() {

    String ipAddress = null;

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

        while (networkInterfaces.hasMoreElements()) {

            NetworkInterface networkInterface = networkInterfaces.nextElement();

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

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

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

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

    return ipAddress;
}

코드의 기능에 대한 설명을 추가하십시오.
HCarrasko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.