java网络编程之识别示例 获取主机网络接口列表
获取主机地址信息
在java中我们使用inetaddress类来代表目标网络地址,包括主机名和数字类型的地址信息,并且inetaddress的实例是不可变的,每个实例始终指向一个地址。inetaddress类包含两个子类,分别对应两个ip地址的版本:
inet4address
inet6address
我们通过前面的笔记可以知道:ip地址实际上是分配给主机与网络之间的连接,而不是主机本身,networkinterface类提供了访问主机所有接口的信息的功能。下面我们通过一个简单的示例程序来学习如何获取网络主机的地址信息:
importjava.net.*;
importjava.util.enumeration;
publicclassinetaddressexample{
publicstaticvoidmain(string[]args){
//todoauto-generatedmethodstub
try{
//获取主机网络接口列表
enumeration<networkinterface>interfacelist=networkinterface
.getnetworkinterfaces();
//检测接口列表是否为空,即使主机没有任何其他网络连接,回环接口(loopback)也应该是存在的
if(interfacelist==null){
system.out.println("--没有发现接口--");
}else{
while(interfacelist.hasmoreelements()){
//获取并打印每个接口的地址
networkinterfaceiface=interfacelist.nextelement();
//打印接口名称
system.out.println("interface"+iface.getname()+";");
//获取与接口相关联的地址
enumeration<inetaddress>addresslist=iface
.getinetaddresses();
//是否为空
if(!addresslist.hasmoreelements()){
system.out.println("\t(没有这个接口相关的地址)");
}
//列表的迭代,打印出每个地址
while(addresslist.hasmoreelements()){
inetaddressaddress=addresslist.nextelement();
system.out
.print("\taddress"
+((addressinstanceofinet4address?"(v4)"
:addressinstanceofinet6address?"v6"
:"(?)")));
system.out.println(":"+address.gethostaddress());
}
}
}
}catch(socketexceptionse){
system.out.println("获取网络接口错误:"+se.getmessage());
}
//获取从命令行输入的每个参数所对应的主机名和地址,迭代列表并打印
for(stringhost:args){
try{
system.out.println(host+":");
inetaddress[]addresslist=inetaddress.getallbyname(host);
for(inetaddressaddress:addresslist){
system.out.println("\t"+address.gethostname()+"/"
+address.gethostaddress());
}
}catch(unknownhostexceptione){
system.out.println("\t无法找到地址:"+host);
}
}
}
}