Heim > Java > javaLernprogramm > Hauptteil

So schreiben Sie Code, um die lokale IP-Adresse in Java zu erhalten

王林
Freigeben: 2023-05-28 08:36:43
nach vorne
2360 Leute haben es durchsucht

Vorwort

Wie erhält man die lokale IP-Adresse in Java genau? Die meisten Methoden im Internet sind InetAddress.getLocalHost().getHostAddress(). Dadurch kann zwar die lokale IP-Adresse ermittelt werden, dies ist jedoch ungenau. Da ein Problem ignoriert wurde, ist die Netzwerkumgebung veränderbar. Verschiedene Netzwerkkarten auf einem Computer verfügen über mehrere IP-Adressen, z. B. LAN, WLAN, Bluetooth, Hotspots, Netzwerkkarten für virtuelle Maschinen usw.

1. Regeln

  • 127.xxx.xxx.xxx gehört zur „Loopback“-Adresse, das heißt, sie kann nur von Ihrem eigenen Computer gesehen werden, was die lokale Adresse ist. 0.1

  • 192.168 xxx.xxx ist eine private Privatadresse (lokale Standortadresse), die innerhalb der lokalen Organisation zugänglich ist und nur im lokalen LAN sichtbar ist

  • Gleiche wie 10.xxx.xxx.xxx , von 172.16.xxx.xxx bis 172.31.xxx.xxx Sie sind alle private Adressen und dienen dem internen Zugriff innerhalb der Organisation. 169.254.xxx.xxx ist eine lokale Link-IP und ist in einem separaten Netzwerksegment verfügbar .xxx.xxx bis 239.xxx .xxx.xxx gehört zur Multicast-Adresse

  • Die spezielle 255.255.255.255 gehört zur Broadcast-Adresse

  • Andere Adressen sind Punkt-zu-Punkt verfügbare öffentliche IPv4-Adressen

  • 2. Erhalten Sie

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

    Referenz:

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

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

unten Teilen eines Beispielcodes zum Erhalten der lokalen IP-Adresse in Java

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));
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo schreiben Sie Code, um die lokale IP-Adresse in Java zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage