获取本地ip地址本来是应该很简单的,但是在项目中本地实现了之后,放到生产环境却不行了,一直获取不到本地ip.
下面先粘出我在生产环境中没有获取到ip地址的一般简单的获取ip地址的流程,最后面是我的解决方法(代码):
public static String getLocalIpAddr() {
Enumeration<NetworkInterface> networks = null;
try {
// 获取网卡设备
networks = ();
} catch (SocketException e) {
(());
}
InetAddress ip = null;
Enumeration<InetAddress> addrs;
// 遍历网卡设备
while (()){
addrs = ().getInetAddresses();
while (()){
ip = ();
if (ip != null && ip instanceof InetAddress && ()){
if (()==null || "".equals(())){
("获取到的客户端内网ip为空,从配置文件读取本地ip。");
return null;
}
return ();// 客户端ip
}
}
}
return null;
}
这样获取在生产环境中出现了ip地址获取不到的情况,因此修改成下面的非常规方法来获取了(皮一下,哈哈):
public static String getLocalIpAddr() {
String clientIP = null;
Enumeration<NetworkInterface> networks = null;
try {
//获取所有网卡设备
networks = ();
if (networks == null) {
//没有网卡设备 打印日志 返回null结束
("networks is null");
return null;
}
} catch (SocketException e) {
(());
}
InetAddress ip;
Enumeration<InetAddress> addrs;
// 遍历网卡设备
while (()) {
NetworkInterface ni = ();
try {
//过滤掉 loopback设备、虚拟网卡
if (!() || () || ()) {
continue;
}
} catch (SocketException e) {
(());
}
addrs = ();
if (addrs == null) {
("InetAddress is null");
continue;
}
// 遍历InetAddress信息
while (()) {
ip = ();
if (!() && () && ().indexOf(":") == -1) {
try {
clientIP = ().split("/")[1];
} catch (ArrayIndexOutOfBoundsException e) {
clientIP = null;
}
}
}
}
return clientIP;
}
因为打印InetAddress对象的时候会打印成 / 这样的格式,所以直接就将这个字符串解析了,虽然比较粗暴,但是也是有效的。