IT이야기

Java를 사용하여 현재 시스템의 IP 주소 가져오기

cyworld 2022. 6. 21. 23:01
반응형

Java를 사용하여 현재 시스템의 IP 주소 가져오기

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

이제 모든 노드가 부트스트래핑노드로 알려진 특수 노드의 IP로 타깃 IP를 가진 소켓을 만듭니다.그런 다음 노드가 자체 노드를 생성합니다.ServerSocket연결을 듣기 시작합니다.

부트스트래핑노드는 노드 목록을 유지하고 쿼리 시 노드 목록을 반환합니다.

이제 노드가 부트스트래핑 노드에 IP를 등록해야 합니다.는 는는그용사 i를 사용해 보았다.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 Connection IP 주소는 117.204.44.192인데 위의 IP 주소는 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 IP 수 .NetworkInterface 어떻게 요?을 사용하다

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

이것은 대부분의 경우 다소 까다로울 수 있습니다.

InetAddress.getLocalHost() 이 합니다.문제는 호스트에 다수의 네트워크인터페이스가 있어 인터페이스가 복수의 IP 주소에 바인드 되는 경우가 있다는 것입니다.게다가 모든 IP 주소에 머신이나 LAN 이외의 장소에서 도달할 수 있는 것은 아닙니다.예를 들어 가상 네트워크 디바이스의 IP 주소, 개인 네트워크 IP 주소 등이 될 수 있습니다.

, 「」에 의해서 가 「」, 「IP」에 의해서 반환되는 을 의미합니다.InetAddress.getLocalHost()사용하지 않을 수도 있습니다.

이걸 어떻게 처리할 수 있을까요?

  • 가지 은 '우리'를 사용하는 입니다.NetworkInterface.getNetworkInterfaces()호스트상의 기존의 네트워크인터페이스를 모두 취득해, 각 NI 의 주소로 반복합니다.
  • 하나의 은 ( 방법으로든)하여 FQDN을 사용하는입니다.InetAddress.getByName()(DNS 기반 로드 밸런서는 어떻게 취득하고 어떻게 처리합니까?)
  • 이전 버전에서는 Config 파일 또는 명령줄 파라미터에서 우선 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는 브로드캐스트주소입니다
  • 의 것은 유효한 퍼블릭포인트 투 포인트 IPv4 주소여야 합니다.

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

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의 수신처를 설정하고 다른 주소의 모든 패킷을 폐기하며 소켓을 "connected" 상태로 전송하여 적절한 필드를 설정합니다.여기에는 시스템의 라우팅 테이블에 따라 수신처에 대한 루트가 존재하는지 확인하고 그에 따라 로컬엔드포인트를 설정하는 것도 포함됩니다.마지막 부분은 공식적으로는 문서화되어 있지 않은 것처럼 보이지만 버클리 소켓 API(UDP "연결" 상태의 부작용)의 필수적인 특성으로 모든 버전과 배포에서 Windows와 Linux에서 안정적으로 작동합니다.

따라서 이 메서드는 지정된 리모트호스트 접속에 사용되는 로컬주소를 지정합니다.실제 접속이 확립되어 있지 않기 때문에 지정된 리모트 IP에 도달할 수 없는 경우가 있습니다.

편집:

@macomgil이 말했듯이 MacOS의 경우 다음과 같이 할 수 있습니다.

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

https://issues.apache.org/jira/browse/JCS-40에서 테스트된 IP 모호성 회피책 코드를 여기에 게시합니다(InetAddress.getLocalHost() Linux 시스템에서는 모호함).

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

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

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

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

system의 출력 = 「 」 「 」 =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

'로컬' 주소를 찾을 때는 각 머신에 네트워크인터페이스가1개만 있는 것이 아니라 각 인터페이스에 독자적인 로컬주소가 있는 것에 주의해 주세요.즉, 시스템은 항상 여러 개의 "로컬" 주소를 소유합니다.

다른 엔드포인트에 연결할 때 사용할 다른 "로컬" 주소가 자동으로 선택됩니다.를 들어, 에 하면, 「」가 .google.com 에 에 접속하면,localhost는 항상 「」입니다localhostlocalhost에 입니다.

아래는 와 통신할 때 로컬 주소를 찾는 방법을 보여 줍니다.google.com:

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

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
  }

편집 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";
        }
    }
}
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;
    }

우선 학급을 수입하다

import java.net.InetAddress;

수업 중에

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

하시면 됩니다.java.net.InetAddress를 사용해 보세요.API를 사용해 보세요.

InetAddress.getLocalHost().getHostAddress();

위의 ACCEPTED 답변의 실제 예입니다.이 NetIdentity 클래스는 내부 호스트 IP와 로컬루프백을 모두 저장합니다.위에서 설명한 것처럼 DNS 기반 서버에 있는 경우 체크를 추가하거나 Configuration File Route를 실행해야 할 수 있습니다.

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 Server를 셋업하고 있기 때문에, 찾고 있던 「패턴」을 이해하는 데 도움이 되었습니다.반환되는 오브젝트에는 이더넷어댑터, 네트워크어댑터, 가상 네트워크어댑터, 드라이버 및 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

InetAddress.getLocalHost()를 사용하여 로컬주소를 가져옵니다.

import java.net.InetAddress;

try {
  InetAddress addr = InetAddress.getLocalHost();            
  System.out.println(addr.getHostAddress());
} catch (UnknownHostException e) {
}
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();
}
}

꽤 간단한 접근법이 효과가 있는 것 같은데...

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

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

시스템이 네트워크의 일부인 경우 네트워크의 IP 주소를 가져옵니다.

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

다른 많은 시스템과 마찬가지로 내 시스템에는 다양한 네트워크 인터페이스가 있었기 때문입니다.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.

주소라는 을 이미 .192.168.2서브넷을 설정합니다.

에는 여러 개의 ""를 할 수 .NetworkInterfaceInetAddress 할 , 의 리마인더는 이 아닌, 또는 es 를 수 . 로컬주소를 필터링 할 경우, 주소의 리마인더는 비로컬주소이며, 1개, 1개 또는 다수의 주소를 가질 수 있습니다.

유감스럽게도 Java의 네트워킹 API는 여전히 반복기와 스트림 대신 (오래된) 열거를 사용합니다. 이 열거는 스트림으로 래핑하여 대항할 수 있습니다.그래서 우리가 해야 할 일은

  • 모든 네트워크인터페이스와 그 주소에 걸쳐 스트리밍을 실시합니다.
  • 고장의 것을 걸러내다.

코드:

private Stream<InetAddress> getNonLocalIpAddresses() throws IOException {
    return enumerationAsStream(NetworkInterface.getNetworkInterfaces())
        .flatMap(networkInterface -> enumerationAsStream(networkInterface.getInetAddresses()))
        .filter(inetAddress -> !inetAddress.isAnyLocalAddress())
        .filter(inetAddress -> !inetAddress.isSiteLocalAddress())
        .filter(inetAddress -> !inetAddress.isLoopbackAddress())
        .filter(inetAddress -> !inetAddress.isLinkLocalAddress());
}

제 머신에서는, 현재 2 개의 IPv6 주소가 반환되고 있습니다.

다음 중 첫 번째 InetAddresses를 얻으려면:

private String getMyIp() throws IOException {
    return getNonLocalIpAddresses()
        .map(InetAddress::getHostAddress)
        .findFirst()
        .orElseThrow(NoSuchElementException::new);
}

열거를 스트림으로 래핑하는 메서드:

public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
    return StreamSupport.stream(
        Spliterators.spliteratorUnknownSize(
            new Iterator<>() {
                public T next() { return e.nextElement();  }
                public boolean hasNext() { return e.hasMoreElements(); }
            }, Spliterator.ORDERED), false);
}

언급URL : https://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java

반응형