我有以下问题:我创建了一个ArrayList,我在这个arraylist中输入了我客户端的所有IP地址(如果客户端有一个网卡,则为一个,如果客户端在具有n个网卡的PC上运行,则为n)不包括环回地址,点对点地址和虚拟地址。
我这样做了:
private static List<String> allIps = new ArrayList<String>();
static {
Enumeration<NetworkInterface> nets;
try {
nets = NetworkInterface.getNetworkInterfaces();
while(nets.hasMoreElements()) {
NetworkInterface current = nets.nextElement();
if ((current.isUp()) && (!current.isPointToPoint()) && (!current.isVirtual()) && (!current.isLoopback())) {
System.out.println(current.getName());
Enumeration<InetAddress> ee = current.getInetAddresses();
while (ee.hasMoreElements()) {
InetAddress i = ee.nextElement();
System.out.println(i.getHostAddress());
allIps.add(i.getHostAddress());
}
}
}
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("List of all IP on this client: "
+ allIps.toString());
System.out.println("Number of ip: " + allIps.size());
}
看起来效果很好,唯一的问题是我的输出(在Eclipse控制台中)是:
eth0
fe80:0:0:0:20c:29ff:fe15:3dfe%2
192.168.15.135
List of all IP on this client: [fe80:0:0:0:20c:29ff:fe15:3dfe%2, 192.168.15.135]
Number of ip: 2
使用调试器和控制台输出对我来说很明显,在这种情况下,唯一存在的网络接口是 eth0 (这是可以的)但是,对于这个网络接口,id找到2个IP地址(一个是IPV6地址,第二个是经典的IPV4地址)
所以它放入我的地址列表 allIps 。
我想选择并在 allIps 列表中仅输入 IPV4 地址,而不是IPV6。我该怎么办呢?我可以在 InetAddress 对象上过滤并仅选择IPV4吗?
TNX
安德烈
答案 0 :(得分:6)
使用instanceof
和Inet4Address类型:
for (NetworkInterface ni :
Collections.list(NetworkInterface.getNetworkInterfaces())) {
for (InetAddress address : Collections.list(ni.getInetAddresses())) {
if (address instanceof Inet4Address) {
System.out.println(address);
}
}
}