>  기사  >  Java  >  Java에서 로컬 IP 주소를 얻는 코드를 작성하는 방법

Java에서 로컬 IP 주소를 얻는 코드를 작성하는 방법

王林
王林앞으로
2023-05-28 08:36:432362검색

머리말

Java에서 로컬 IP 주소를 정확하게 얻는 방법은 무엇입니까? 인터넷에 있는 대부분의 방법은 InetAddress.getLocalHost().getHostAddress()입니다. 실제로 로컬 IP 주소를 얻을 수 있지만 정확하지 않습니다. 한 가지 문제가 무시되었기 때문에 컴퓨터의 다양한 네트워크 카드에는 Lan, WiFi, Bluetooth, 핫스팟, 가상 머신 네트워크 카드 등과 같은 여러 IP 주소가 있습니다.

1. 규칙

  • 127.xxx.xxx.xxx은 "루프백" 주소에 속합니다. 즉, 로컬 주소인 127.0입니다. 0.1

  • 192.168.xxx.xxx는 비공개 비공개 주소(사이트 로컬 주소)로, 로컬 조직 내에서 접속 가능하며 로컬 LAN에서만 볼 수 있습니다

  • 10.xxx.xxx.xxx와 동일 , 172.16.xxx.xxx에서 172.31.xxx.xxx까지 모두 개인 주소이며 조직 내 내부 액세스용입니다. 169.254.xxx.xxx는 링크 로컬 IP이며 별도의 네트워크 세그먼트에서 사용할 수 있습니다. .xxx.xxx ~ 239.xxx .xxx.xxx는 멀티캐스트 주소에 속합니다

  • 특수 255.255.255.255는 브로드캐스트 주소에 속합니다

  • 다른 주소는 지점 간 사용 가능한 공용 IPv4 주소입니다

  • 2. 획득

  • 1.
  •  public static void main(String[] args) throws SocketException {
            System.out.println( IpUtil.getLocalIp4Address().get().toString().replaceAll("/",""));
        }

    2. 도구 클래스

    package com.dingwen.test.utils;
    import org.springframework.util.ObjectUtils;
    import java.net.*;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.Optional;
    /**
     * 获取本机IP 地址
     *
     * @author dingwen
     * 2021.04.28 11:49
     */
    public class IpUtil {
        /*
         * 获取本机所有网卡信息   得到所有IP信息
         * @return Inet4Address>
         */
        public static List<Inet4Address> getLocalIp4AddressFromNetworkInterface() throws SocketException {
            List<Inet4Address> addresses = new ArrayList<>(1);
            // 所有网络接口信息
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            if (ObjectUtils.isEmpty(networkInterfaces)) {
                return addresses;
            }
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头
                if (!isValidInterface(networkInterface)) {
                    continue;
                }
                // 所有网络接口的IP地址信息
                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                while (inetAddresses.hasMoreElements()) {
                    InetAddress inetAddress = inetAddresses.nextElement();
                    // 判断是否是IPv4,并且内网地址并过滤回环地址.
                    if (isValidAddress(inetAddress)) {
                        addresses.add((Inet4Address) inetAddress);
                    }
                }
            }
            return addresses;
        }
        /**
         * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头
         *
         * @param ni 网卡
         * @return 如果满足要求则true,否则false
         */
        private static boolean isValidInterface(NetworkInterface ni) throws SocketException {
            return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual()
                    && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens"));
        }
        /**
         * 判断是否是IPv4,并且内网地址并过滤回环地址.
         */
        private static boolean isValidAddress(InetAddress address) {
            return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();
        }
        /*
         * 通过Socket 唯一确定一个IP
         * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的
         * @return Inet4Address>
         */
        private static Optional<Inet4Address> getIpBySocket() throws SocketException {
            try (final DatagramSocket socket = new DatagramSocket()) {
                socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
                if (socket.getLocalAddress() instanceof Inet4Address) {
                    return Optional.of((Inet4Address) socket.getLocalAddress());
                }
            } catch (UnknownHostException networkInterfaces) {
                throw new RuntimeException(networkInterfaces);
            }
            return Optional.empty();
        }
        /*
         * 获取本地IPv4地址
         * @return Inet4Address>
         */
        public static Optional<Inet4Address> getLocalIp4Address() throws SocketException {
            final List<Inet4Address> inet4Addresses = getLocalIp4AddressFromNetworkInterface();
            if (inet4Addresses.size() != 1) {
                final Optional<Inet4Address> ipBySocketOpt = getIpBySocket();
                if (ipBySocketOpt.isPresent()) {
                    return ipBySocketOpt;
                } else {
                    return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0));
                }
            }
            return Optional.of(inet4Addresses.get(0));
        }
    }
  • 를 사용하세요. p/7071227.html

아래 Java에서 로컬 IP 주소를 얻기 위한 샘플 코드 공유

import java.net.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * 获取本机IP 地址
 */
public class IpUtil {
    /*
     * 获取本机所有网卡信息   得到所有IP信息
     * @return Inet4Address>
     */
    public static List<Inet4Address> getLocalIp4AddressFromNetworkInterface() throws SocketException {
        List<Inet4Address> addresses = new ArrayList<>(1);
        // 所有网络接口信息
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        if (Objects.isNull(networkInterfaces)) {
            return addresses;
        }
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = networkInterfaces.nextElement();
            //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头
            if (!isValidInterface(networkInterface)) {
                continue;
            }
            // 所有网络接口的IP地址信息
            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
            while (inetAddresses.hasMoreElements()) {
                InetAddress inetAddress = inetAddresses.nextElement();
                // 判断是否是IPv4,并且内网地址并过滤回环地址.
                if (isValidAddress(inetAddress)) {
                    addresses.add((Inet4Address) inetAddress);
                }
            }
        }
        return addresses;
    }
    /**
     * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头
     *
     * @param ni 网卡
     * @return 如果满足要求则true,否则false
     */
    private static boolean isValidInterface(NetworkInterface ni) throws SocketException {
        return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual()
                && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens"));
    }
    /**
     * 判断是否是IPv4,并且内网地址并过滤回环地址.
     */
    private static boolean isValidAddress(InetAddress address) {
        return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();
    }
    /*
     * 通过Socket 唯一确定一个IP
     * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的
     * @return Inet4Address>
     */
    private static Optional<Inet4Address> getIpBySocket() throws SocketException {
        try (final DatagramSocket socket = new DatagramSocket()) {
            socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
            if (socket.getLocalAddress() instanceof Inet4Address) {
                return Optional.of((Inet4Address) socket.getLocalAddress());
            }
        } catch (UnknownHostException networkInterfaces) {
            throw new RuntimeException(networkInterfaces);
        }
        return Optional.empty();
    }
    /*
     * 获取本地IPv4地址
     * @return Inet4Address>
     */
    public static Optional<Inet4Address> getLocalIp4Address() throws SocketException {
        final List<Inet4Address> inet4Addresses = getLocalIp4AddressFromNetworkInterface();
        if (inet4Addresses.size() != 1) {
            final Optional<Inet4Address> ipBySocketOpt = getIpBySocket();
            if (ipBySocketOpt.isPresent()) {
                return ipBySocketOpt;
            } else {
                return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0));
            }
        }
        return Optional.of(inet4Addresses.get(0));
    }
}

위 내용은 Java에서 로컬 IP 주소를 얻는 코드를 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제