InterfaceAddress.getNetworkPrefixLength() , 这个方法会返回子网掩码前面的1的位数。
为了直观,下面的例子会将其转换为String并显示出来。
关于下面的例子,还有几点要说明:
1. 因为我们数据库中的ip地址存的全是字符串,所以例子中也已字符串的形式来操作。
对于很多方法,直接拿int来移位会更简单。
2. 为了让例子独立跑起来,没有将共同的部分抽取成更小函数,也没有使用apache.common这样的第三方包。
这就使得函数比较冗长。
不罗嗦了,代码大家将就着看,如下:
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
public class IPAddressTest {
public static void main(String[] args) {
printIpAddressAndSubnettest();
}
public static void printIpAddressAndSubnettest() {
try {
Enumeration<NetworkInterface> eni = NetworkInterface
.getNetworkInterfaces();
while (eni.hasMoreElements()) {
NetworkInterface networkCard = eni.nextElement();
List<InterfaceAddress> ncAddrList = networkCard
.getInterfaceAddresses();
Iterator<InterfaceAddress> ncAddrIterator = ncAddrList.iterator();
while (ncAddrIterator.hasNext()) {
InterfaceAddress networkCardAddress = ncAddrIterator.next();
InetAddress address = networkCardAddress.getAddress();
if (!address.isLoopbackAddress()) {
String hostAddress = address.getHostAddress();
System.out.println("address = " + hostAddress);
if (hostAddress.indexOf(":") > 0) {
// case : ipv6
continue;
} else {
// case : ipv4
String maskAddress = calcMaskByPrefixLength(networkCardAddress.getNetworkPrefixLength());
String subnetAddress = calcSubnetAddress(hostAddress, maskAddress);
String broadcastAddress = networkCardAddress.getBroadcast().getHostAddress();
System.out.println("subnetmask = "+ maskAddress);
System.out.println("subnet = "+ subnetAddress);
System.out.println("broadcast = "+ broadcastAddress+"\n");
}
} else {
String loopback = networkCardAddress.getAddress().getHostAddress();
System.out.println("loopback addr = " + loopback +"\n");
}
}
System.out.println("----- NetworkInterface Separator ----\n\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String calcMaskByPrefixLength(int length) {
int mask = -1 << (32 - length);
int partsNum = 4;
int bitsOfPart = 8;
int maskParts[] = new int[partsNum];
int selector = 0x000000ff;
for (int i = 0; i < maskParts.length; i++) {
int pos = maskParts.length - 1 - i;
maskParts[pos] = (mask >> (i * bitsOfPart)) & selector;
}
String result = "";
result = result + maskParts[0];
for (int i = 1; i < maskParts.length; i++) {
result = result + "." + maskParts[i];
}
return result;
}
public static String calcSubnetAddress(String ip, String mask) {
String result = "";
try {
// calc sub-net IP
InetAddress ipAddress = InetAddress.getByName(ip);
InetAddress maskAddress = InetAddress.getByName(mask);
byte[] ipRaw = ipAddress.getAddress();
byte[] maskRaw = maskAddress.getAddress();
int unsignedByteFilter = 0x000000ff;
int[] resultRaw = new int[ipRaw.length];
for (int i = 0; i < resultRaw.length; i++) {
resultRaw[i] = (ipRaw[i] & maskRaw[i] & unsignedByteFilter);
}
// make result string
result = result + resultRaw[0];
for (int i = 1; i < resultRaw.length; i++) {
result = result + "." + resultRaw[i];
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
return result;
}
}