本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:Java网络编程从入门到精通(4):DNS缓存
该方法可以得到远程主机的域名,也可以得到本机名。getHostName方法的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicStringgetHostName()
下面是三种创建InetAddress对象的方式,在这三种方式中,getHostName返回的值是不同的。
1.使用getLocalHost方法创建InetAddress对象
如果InetAddress对象是用getLocalHost方法创建的,getHostName返回的是本机名。如下面的代码所示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->InetAddressaddress=InetAddress.getLocalHost();
System.out.println(address.getHostName());//输出本机名
2.使用域名创建InetAddress对象
用域名作为getByName和getAllByName方法的参数调用这两个方法后,系统会自动记住这个域名。当调用getHostName方法时,就无需再访问DNS服务器,而是直接将这个域名返回。如下面的代码所示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->InetAddressaddress=InetAddress.getByName("www.oracle.com");
System.out.println(address.getHostName());//无需访问DNS服务器,直接返回域名
3.使用IP地址创建InetAddress对象
使用IP地址创建InetAddress对象时(getByName、getAllByName和getByAddress方法都可以通过IP地址创建InetAddress对象),并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。如果这个IP地址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。如下面的代码所示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->InetAddressaddress=InetAddress.getByName("141.146.8.66");
System.out.println(address.getHostName());//需要访问DNS服务器才能得到域名
InetAddressaddress=InetAddress.getByName("1.2.3.4");//IP地址不存在
System.out.println(address.getHostName());//直接返回IP地址
从上面的三种情况可以看出,只有通过使用IP地址创建的InetAddress对象调用getHostName方法时才访问DNS服务器。在其他情况,getHostName方法并不会访问DNS服务器,而是直接将域名或本机名返回。下面的代码演示了在不同情况下如何使用getHostName方法,并计算了各种情况所需的毫秒数。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package mynet;
importjava.net.*;
publicclass DomainName
{
publicstaticvoidmain(String[]args)throwsException
{
longtime=0;
//得到本机名
InetAddressaddress1=InetAddress.getLocalHost();
System.out.println("本机名:"+address1.getHostName());
//直接返回域名
InetAddressaddress2=InetAddress.getByName("www.oracle.com");
time=System.currentTimeMillis();
System.out.print("直接得到域名:"+address2.getHostName());
System.out.println("所用时间:"
+String.valueOf(System.currentTimeMillis()-time)+"毫秒");
//通过DNS查找域名
InetAddressaddress3=InetAddress.getByName("141.146.8.66");
System.out.println("address3:"+address3);//域名为空
time=System.currentTimeMillis();
System.out.print("通过DNS查找域名:"+address3.getHostName());
System.out.println("所用时间:" +String.valueOf(System.currentTimeMillis()-time)+"毫秒");
System.out.println("address3:"+address3);//同时输出域名和IP地址
}
}
运行结果:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->本机名:ComputerName
直接得到域名:www.oracle.com所用时间:0毫秒
address3:/141.146.8.66
通过DNS查找域名:bigip-otn-portal.oracle.com所用时间:92毫秒
address3:bigip-otn-portal.oracle.com/141.146.8.66
从上面的运行结果可以看出,第一个毫秒数是0,而第二个毫秒数是92。这说时,使用域名创建的InetAddress对象在使用getHostName方法时并不访问DNS服务器,而使用IP地址创建的InetAddress对象在使用getHostName方法时需要访问DNS服务器。对于第三个毫秒数,可能多次运行DomainName后会越来越小,这是因为DNS服务器的缓存的缘故。但一般这个数都会比0大。也许有很多人会问,第二行和第四行得到的域名怎么不一样,其实www.oracle.com和bigip-otn-portal.oracle.com都是oracle的域名,我们也可以通过http://
bigip-otn-portal.oracle.com来访问oracle的官方网站。至于这两个域名有什么区别,将在下面的文章中讨论。
下一篇:Java网络编程从入门到精通(6):使用getCanonicalHostName方法获得主机名
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!《银河系列原创教程》发布《Java Web开发速学宝典》出版,欢迎定购
分享到:
相关推荐
Java网络编程基础-InetAddress类与URL类
Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三步学会Java Socket编程(一) .doc Java基础 ...
网络编程 InetAddress 的使用
Java网络基本类 ---InetAddress类;import .*; public class IPAddressDemo { public static void main(String[] args) { try { InetAddress localAddr = InetAddress.getLocalHost();//获得本机InetAddress System....
Java网络编程主要涉及以下几个方面的内容: 网络基础知识:了解网络通信的基本原理,包括IP地址、端口号、协议等。 Socket编程:Socket是Java中实现网络通信的基础类。通过Socket类,可以实现基于TCP和UDP协议的网络...
针对不同层次的网络通信,Java提供的网络功能有4大类:URL、InetAddress、Socket、Datagram。以基于Socket的Java网络编程为例,来探讨Java网络编程,具有一定的参考价值。
InetAddress 类进行域名解析后,域名和ip会保存,如何清除。本资源娓娓道来。
为了方便开发,Java中提供了很多进行网络开发的辅助类,通过这些类的恰到使用可以在网络开发中达到事半功倍的效果。针对网络通信的不同层次,Java提供的网络开发的辅助类有四大类:InetAddress 、URLs、Sockets、...
[奥莱理] Java 网络编程 第4版 (英文版) [奥莱理] Java Network Programming 4th Edition (E-Book) ☆ 图书概要:☆ This practical guide provides a complete introduction to developing network programs ...
主要介绍了Java编程中利用InetAddress类确定特殊IP地址的方法,InetAddress类是Java网络编程中一个相当实用的类,需要的朋友可以参考下
5. 2 Java网络编程中的高层类 5. 2. 1 URL类 5. 2. 2 URLConnection类 第6章 利用Servlet上传和下载文件 6. 1 得到HTTP请求消息的内容 6. 2 利用Servlet得到上传的文件 6. 2. 1 上传文件及表单域的请求实体的...
主要介绍了Java中的IP地址和InetAddress类使用详解,是Java入门学习中的基础知识,需要的朋友可以参考下
最近在学习soket编程中,看到有需要获取到IP地址之类的需求,所以就去看了下如何获取到主机名的IP地址。 其实就是需要用到一个类InetAddress。他是在java.net包下面。 InetAddress类的对象用于IP地址和域名,该类...
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/784338
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
InetAddress域名解析
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...