在Java中获取服务器IP地址
在Java中获取服务器IP地址有几种不同的方法,具体取决于你的需求(是获取本机IP还是远程服务器IP)以及运行环境(是客户端应用还是服务器端应用)。

获取本机IP地址
获取本机所有网络接口的IP地址
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class GetLocalIP {
public static void main(String[] args) {
try {
// 获取所有网络接口
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
// 获取网络接口的IP地址
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
// 过滤掉回环地址和IPv6地址(如果只需要IPv4)
if (!inetAddress.isLoopbackAddress() && !inetAddress.getHostAddress().contains(":")) {
System.out.println("Interface: " + networkInterface.getName());
System.out.println("Display Name: " + networkInterface.getDisplayName());
System.out.println("IP Address: " + inetAddress.getHostAddress());
System.out.println("Host Name: " + inetAddress.getHostName());
System.out.println("Canonical Host Name: " + inetAddress.getCanonicalHostName());
System.out.println("---------------------");
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
获取本机主机名和默认IP地址
import java.net.InetAddress;
public class GetLocalHostName {
public static void main(String[] args) {
try {
// 获取本地主机名
String hostName = InetAddress.getLocalHost().getHostName();
System.out.println("Host Name: " + hostName);
// 获取本地IP地址
String ipAddress = InetAddress.getLocalHost().getHostAddress();
System.out.println("IP Address: " + ipAddress);
} catch (Exception e) {
e.printStackTrace();
}
}
}
获取远程服务器IP地址
通过主机名获取远程服务器IP
import java.net.InetAddress;
public class GetRemoteIP {
public static void main(String[] args) {
try {
// 通过主机名获取IP地址
InetAddress[] addresses = InetAddress.getAllByName("www.example.com");
for (InetAddress address : addresses) {
System.out.println("Host: " + address.getHostName());
System.out.println("IP Address: " + address.getHostAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过URL获取远程服务器IP
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
public class GetServerIPFromURL {
public static void main(String[] args) {
try {
URL url = new URL("http://www.example.com");
String host = url.getHost();
InetAddress[] addresses = InetAddress.getAllByName(host);
for (InetAddress address : addresses) {
System.out.println("Host: " + host);
System.out.println("IP Address: " + address.getHostAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在Web应用中获取客户端IP地址
如果你是在Servlet或Spring Boot等Web框架中,获取客户端IP地址的方法如下:
Servlet中获取客户端IP
import javax.servlet.http.HttpServletRequest;
public class ClientIP {
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 对于多个IP的情况(如X-Forwarded-For: client, proxy1, proxy2),取第一个
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0].trim();
}
return ip;
}
}
Spring Boot中获取客户端IP
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class IPController {
@GetMapping("/ip")
public String getClientIp(HttpServletRequest request) {
String ip = request.getRemoteAddr();
// 如果使用了代理服务器,可能需要从特定header获取
if (request.getHeader("X-Forwarded-For") != null) {
ip = request.getHeader("X-Forwarded-For").split(",")[0].trim();
} else if (request.getHeader("Proxy-Client-IP") != null) {
ip = request.getHeader("Proxy-Client-IP");
} else if (request.getHeader("WL-Proxy-Client-IP") != null) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
return "Client IP: " + ip;
}
}
注意事项
-
IPv6和IPv4:上面的代码中有些部分过滤掉了IPv6地址,如果需要支持IPv6,请移除相关过滤条件。
-
代理服务器:当应用部署在反向代理(如Nginx、Apache)后面时,直接获取的可能是代理服务器的IP,需要从特定HTTP头(如X-Forwarded-For)获取真实客户端IP。
-
网络接口:服务器可能有多个网络接口,每个接口可能有不同的IP地址,需要根据实际需求选择合适的IP。
(图片来源网络,侵删) -
权限:某些网络接口可能需要特殊权限才能访问。
-
容器化环境:在Docker等容器化环境中,获取IP的方式可能需要特殊处理。

