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

使用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();
}
}
}
注意事项
- 某些情况下,
InetAddress.getLocalHost()可能返回IPv6地址,需要额外检查 - 在生产环境中,应该考虑处理网络接口可能不存在或不可访问的情况
- 获取网络接口信息可能需要管理员权限(尤其是在某些操作系统上)
- 对于多网络环境,可能需要更复杂的逻辑来确定哪个IPv4地址最适合使用
方法提供了不同场景下获取IPv4地址的解决方案,你可以根据具体需求选择最适合的方式。

