InetAddress类之创建新的InetAddress对象
java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示。大多数其他网络类都要用到这个类,包括Socket,ServerSocket,URL,DatagramSocket,DatagramPacket等。一般地讲,它包括一个主机名和一个IP地址。
创建新的InetAddress对象
InetAddress类没有公共构造函数。实际上,InetAddress有一些静态工厂方法,可以连接到DNS服务器来解析主机名。最常用的是InetAddress.getByName()。 例如,可以如下查找www.oreilly.com:
InetAddress address = InetAddress.getByName("www.oreilly.com");
这个方法并不只是设置InetAddress类中的一个私有String字段。实际上它会建立与本地DNS服务器的一个连接,来查找名字和数字地址(如果你之前查找过这个主机,这个信息可能会在本地缓存,如果是这样,就不需要再建立网络连接)。如果DNS服务器找不到这个地址,这个方法会抛出一个UnknownHostException异常,这是IOException的一个子类。
下例展示了一个完整的程序,它为www.oreilly.com创建一个InetAddress对象,这里包括所有必要的导入和异常处理:
package o2; import java.net.InetAddress; import java.net.UnknownHostException; public class OreillyByName { public static void main(String[] args) { try { InetAddress address = InetAddress.getByName("www.oreilly.com"); System.out.println(address.getHostAddress()); } catch (UnknownHostException e) { e.printStackTrace(); } } }
之前我们提到过www.oreilly.com实际上有两个地址。getByName()返回哪一个地址是不确定的。如果出于某种原因你需要得到一个主机的所有地址,可以调用getAllByName(),它会返回一个数组:
package o2; import java.net.InetAddress; import java.net.UnknownHostException; public class OreillyByName { public static void main(String[] args) { try { InetAddress[] addrs = InetAddress.getAllByName("www.oreilly.com"); if(addrs != null && addrs.length > 0){ for(InetAddress addr : addrs){ System.out.println(addr.getHostAddress()); } } } catch (UnknownHostException e) { e.printStackTrace(); } } }
最后,getLocalHost()方法会为运行这个代码的主机返回一个InetAddress对象:
InetAddress me = InetAddress.getLocalHost();
这个方法尝试连接DNS来得到一个真正的主机名和IP地址,如“elharo.laptop.corp.com”和“192.1.254.68”; 不过如果失败,它就会返回回送地址,即主机名“localhost”和点分四段地址“127.0.0.1”。查找本地机器的地址示例:
package o2; import java.net.InetAddress; import java.net.UnknownHostException; public class MyAddress { public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println(address.getHostAddress()); } catch (UnknownHostException e) { e.printStackTrace(); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。