在Java中获取服务器IP地址是一个常见的需求,尤其在开发网络应用、监控系统或需要服务器网络信息的服务时,获取IP地址的方法多种多样,具体取决于需求场景,例如获取本机所有IP、指定网卡的IP或服务器的公网IP等,以下是几种常见的实现方式及详细说明。

获取本机所有IP地址
通过Java的NetworkInterface类可以枚举本机所有网络接口,并获取每个接口绑定的IP地址,这种方法适用于需要获取服务器所有网络配置的场景,包括虚拟网卡、回环地址等,以下是核心代码示例:
import java.net.*;
import java.util.Enumeration;
public class GetLocalIPs {
public static void main(String[] args) throws SocketException {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (!addr.isLoopbackAddress() && addr instanceof Inet4Address) {
System.out.println("Interface: " + ni.getName() + ", IP: " + addr.getHostAddress());
}
}
}
}
}
说明:
NetworkInterface.getNetworkInterfaces()获取所有网络接口,包括物理网卡和虚拟网卡。isLoopbackAddress()过滤掉回环地址(如127.0.0.1),instanceof Inet4Address确保只获取IPv4地址。- 输出示例可能包括
eth0、docker0等接口的IP地址。
获取指定网卡的IP地址
如果只需要特定网卡(如eth0)的IP,可以通过NetworkInterface的名称进行过滤:
NetworkInterface ni = NetworkInterface.getByName("eth0");
if (ni != null) {
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (!addr.isLoopbackAddress()) {
System.out.println("Target IP: " + addr.getHostAddress());
}
}
}
注意事项:

- 网卡名称(如
eth0、en0)与操作系统相关,Linux中通常为eth0,Windows中可能为本地连接。 - 如果网卡不存在或未启用,会抛出
SocketException。
获取服务器的公网IP地址
在某些场景下(如API调用、日志记录),需要获取服务器对外暴露的公网IP,由于Java无法直接获取公网IP,通常通过访问第三方服务(如http://checkip.amazonaws.com)实现:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class GetPublicIP {
public static void main(String[] args) throws Exception {
URL url = new URL("http://checkip.amazonaws.com");
try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
String publicIP = in.readLine();
System.out.println("Public IP: " + publicIP);
}
}
}
说明:
- 第三方服务返回的IP通常是服务器出口IP,可能受NAT影响。
- 需处理网络异常(如
IOException),并确保服务可用性。
常见方法对比
以下表格总结了不同获取方式的适用场景和优缺点:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| NetworkInterface | 获取本机所有或指定网卡IP | 无需网络请求,获取本地IP | 无法获取公网IP,可能包含虚拟IP |
| 第三方API调用 | 获取服务器公网IP | 直接获取出口IP,适用于网络服务 | 依赖外部服务,需处理网络异常 |
| InetAddress.getLocalHost() | 获取本机默认IP(可能不准确) | 代码简单 | 可能返回回环地址或非预期IP |
相关问答FAQs
问题1:为什么InetAddress.getLocalHost()返回的IP有时不是服务器的实际IP?
解答:getLocalHost()方法依赖于操作系统的主机名解析,如果主机名配置错误(如未正确设置/etc/hosts或DNS解析),可能返回0.0.1或非预期IP,推荐使用NetworkInterface或第三方API获取准确IP。
问题2:如何区分IPv4和IPv6地址?
解答:通过instanceof关键字判断,例如if (addr instanceof Inet4Address)表示IPv4,if (addr instanceof Inet6Address)表示IPv6,在获取IP时可根据需求过滤特定协议版本。
