杰瑞科技汇

java 获取ipv4的地址

在Java中获取IPv4地址

在Java中获取IPv4地址有几种方法,以下是几种常用的实现方式:

java 获取ipv4的地址-图1
(图片来源网络,侵删)

使用InetAddress

import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIPv4 {
    public static void main(String[] args) {
        try {
            // 获取本地主机名和IP地址
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println("主机名: " + localHost.getHostName());
            System.out.println("IP地址: " + localHost.getHostAddress());
            // 检查是否是IPv4地址
            if (!localHost.getHostAddress().contains(":")) {
                System.out.println("IPv4地址: " + localHost.getHostAddress());
            }
            // 获取特定域名的IP地址
            InetAddress address = InetAddress.getByName("www.example.com");
            System.out.println("www.example.com的IP地址: " + address.getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

获取所有网络接口的IPv4地址

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class GetAllIPv4 {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                while (inetAddresses.hasMoreElements()) {
                    InetAddress inetAddress = inetAddresses.nextElement();
                    // 过滤掉IPv6地址和回环地址
                    if (!inetAddress.isLoopbackAddress() && 
                        inetAddress.getHostAddress().indexOf(':') < 0) {
                        System.out.println("网络接口: " + networkInterface.getName());
                        System.out.println("IPv4地址: " + inetAddress.getHostAddress());
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

使用Java 8的Stream API过滤IPv4地址

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class GetIPv4WithStream {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            Stream<NetworkInterface> networkInterfaceStream = StreamSupport.stream(
                Spliterators.spliteratorUnknownSize(networkInterfaces.asIterator(), Spliterator.ORDERED), false);
            networkInterfaceStream
                .flatMap(networkInterface -> {
                    Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                    return StreamSupport.stream(
                        Spliterators.spliteratorUnknownSize(inetAddresses.asIterator(), Spliterator.ORDERED), false);
                })
                .filter(inetAddress -> !inetAddress.isLoopbackAddress() && 
                                      inetAddress.getHostAddress().indexOf(':') < 0)
                .forEach(inetAddress -> {
                    try {
                        System.out.println("IPv4地址: " + inetAddress.getHostAddress() + 
                                         " (来自接口: " + NetworkInterface.getByInetAddress(inetAddress).getName() + ")");
                    } catch (SocketException e) {
                        e.printStackTrace();
                    }
                });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用第三方库(如Apache Commons Net)

如果你需要更强大的网络功能,可以使用Apache Commons Net库:

import org.apache.commons.net.util.SubnetUtils;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ApacheNetExample {
    public static void main(String[] args) {
        try {
            // 获取本地IP
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println("本地IPv4地址: " + localHost.getHostAddress());
            // 使用SubnetUtils处理子网
            SubnetUtils subnet = new SubnetUtils("192.168.1.0/24");
            SubnetUtils.SubnetInfo info = subnet.getInfo();
            System.out.println("网络地址: " + info.getNetworkAddress());
            System.out.println("广播地址: " + info.getBroadcastAddress());
            System.out.println("可用地址范围: " + info.getAddressLow() + " - " + info.getAddressHigh());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

注意事项

  1. 某些情况下,InetAddress.getLocalHost()可能返回IPv6地址,需要额外检查
  2. 在生产环境中,应该考虑处理网络接口可能不存在或不可访问的情况
  3. 获取网络接口信息可能需要管理员权限(尤其是在某些操作系统上)
  4. 对于多网络环境,可能需要更复杂的逻辑来确定哪个IPv4地址最适合使用

方法提供了不同场景下获取IPv4地址的解决方案,你可以根据具体需求选择最适合的方式。

java 获取ipv4的地址-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇