Maison >Java >javaDidacticiel >Comment écrire le code pour obtenir l'adresse IP locale en Java

Comment écrire le code pour obtenir l'adresse IP locale en Java

王林
王林avant
2023-05-28 08:36:432400parcourir

Avant-propos

Comment obtenir avec précision l'adresse IP locale en Java ? La plupart des méthodes sur Internet sont InetAddress.getLocalHost().getHostAddress(). Cela permet effectivement d'obtenir l'adresse IP locale, mais elle est inexacte. Parce qu'un problème a été ignoré, l'environnement réseau est modifiable. Différentes cartes réseau sur un ordinateur ont plusieurs adresses IP, telles que Lan, WiFi, Bluetooth, points d'accès, cartes réseau de machine virtuelle, etc.

1. Règles

  • 127.xxx.xxx.xxx appartient à l'adresse "loopback", c'est-à-dire qu'elle ne peut être vue que par votre propre machine, qui est l'adresse locale. 0.1

  • 192.168.xxx.xxx est une adresse privée privée (adresse locale du site), accessible au sein de l'organisation locale et visible uniquement sur le réseau local

  • Identique à 10.xxx.xxx.xxx. , de 172.16.xxx.xxx à 172.31.xxx.xxx. Ce sont toutes des adresses privées et sont destinées à un accès interne au sein de l'organisation. 169.254.xxx.xxx est une adresse IP locale de liaison et est disponible sur un segment de réseau distinct. .xxx.xxx à 239.xxx .xxx.xxx appartient à l'adresse de multidiffusion

  • Le spécial 255.255.255.255 appartient à l'adresse de diffusion

  • Les autres adresses sont des adresses IPv4 publiques disponibles point à point

  • 2. Obtenir

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

    2. Classe d'outils

    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));
        }
    }
  • Référence :

https://www.jianshu.com/p/f619663f0f0a

https://www.cnblogs.com/starcrm/ p/7071227.html

ci-dessous Partage d'un exemple de code pour obtenir l'adresse IP locale en Java

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer