您的位置:首页 > 运维架构 > Linux

JAVA Window、Linux 获取实际IP地址

2016-01-21 17:32 603 查看
/**
* 1、Windows平台下获得本机ip地址
* 2、Linux平台下获得本机ip地址。由于和Windows平台不同,不能用经典的方式查看。
* 但是可以通过查询网络接口(NetworkInterface)的方式来实现。
* 本程序中同样运用了JAVA核心技术:枚举类型。
* 枚举类型不仅可以使程序员少写某些代码,主要还提供了编译时的安全检查,可以很好的解决类安全问题。
* @Tseng
*/
public static String ipIsLinuxOrWindows() {
String return_ip = "";
InetAddress ip = null;
try {
// 如果是Windows操作系统,多个IP地址时把虚拟机的IP地址剔除掉
if (Common.isWindows()) {
// ip = InetAddress.getLocalHost();
// System.out.println(ip); //打印网端名字
List<NetCard> cards = NetworkCardScan.getNetCards();//获取网卡信息:网卡名称,网卡对应的ip范围 本地网卡,无线网卡
for (NetCard card : cards) {
//System.out.println(card.getNetcard() + "--" + card.getNetcardIp() + "--" + card.getNetcardIpRange() + "--" + card.getNetcardName());
int inde = (card.getNetcardName().toString().toUpperCase()).indexOf(("VM")) ;
if(inde == -1){
return_ip += card.getNetcardIp() + "," ;
}
}
return_ip = return_ip.substring(0, return_ip.length()-1);
} else {
// 如果是Linux操作系统
boolean bFindIP = false;
//获得网络接口
Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface.getNetworkInterfaces();
//遍历所有的网络接口
while (netInterfaces.hasMoreElements()) {
if (bFindIP) {
break;
}
NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
// ----------特定情况,可以考虑用ni.getName判断
System.out.println(ni.getName()); //打印网端名字
// 遍历所有ip
Enumeration<InetAddress> ips = ni.getInetAddresses();//同样再定义网络地址枚举类
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() // 127.开头的都是lookback地址
&& ip.getHostAddress().indexOf(":") == -1) {
if (ip != null && (ip instanceof Inet4Address)) //InetAddress类包括Inet4Address和Inet6Address
bFindIP = true;
break;
}
}
}
if (null != ip) {
return_ip = ip.getHostAddress();
}
}
} catch (Exception e) {
e.printStackTrace();
}

return return_ip;
}

//获取本机IP
/**
* 1、Windows平台下获得本机ip地址
* 2、Linux平台下获得本机ip地址。由于和Windows平台不同,不能用经典的方式查看。
* 但是可以通过查询网络接口(NetworkInterface)的方式来实现。
* 本程序中同样运用了JAVA核心技术:枚举类型。
* 枚举类型不仅可以使程序员少写某些代码,主要还提供了编译时的安全检查,可以很好的解决类安全问题。
* @Tseng
*/
public static String ipIsLinuxOrWindows() {
String return_ip = "";
InetAddress ip = null;
try {
// 如果是Windows操作系统,多个IP地址时把虚拟机的IP地址剔除掉
if (Common.isWindows()) {
// ip = InetAddress.getLocalHost();
// System.out.println(ip); //打印网端名字
List<NetCard> cards = NetworkCardScan.getNetCards();//获取网卡信息:网卡名称,网卡对应的ip范围
for (NetCard card : cards) {
//System.out.println(card.getNetcard() + "--" + card.getNetcardIp() + "--" + card.getNetcardIpRange() + "--" + card.getNetcardName());
int inde = (card.getNetcardName().toString().toUpperCase()).indexOf(("VM")) ;
if(inde == -1){
return_ip += card.getNetcardIp() + "," ;
}
}
return_ip = return_ip.substring(0, return_ip.length()-1);
} else {
// 如果是Linux操作系统
boolean bFindIP = false;
//获得网络接口
Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface.getNetworkInterfaces();
//遍历所有的网络接口
while (netInterfaces.hasMoreElements()) {
if (bFindIP) {
break;
}
NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
// ----------特定情况,可以考虑用ni.getName判断
System.out.println(ni.getName()); //打印网端名字
// 遍历所有ip
Enumeration<InetAddress> ips = ni.getInetAddresses();//同样再定义网络地址枚举类
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() // 127.开头的都是lookback地址
&& ip.getHostAddress().indexOf(":") == -1) {
if (ip != null && (ip instanceof Inet4Address)) //InetAddress类包括Inet4Address和Inet6Address
bFindIP = true;
break;
}
}
}
if (null != ip) {
return_ip = ip.getHostAddress();
}
}
} catch (Exception e) {
e.printStackTrace();
}

return return_ip;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: