本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名
getCanonicalHostName方法和getHostName方法一样,也是得到远程主机的域名。但它们有一个区别。getCanonicalHostName得到的是主机名,而getHostName得到的主机别名。getCanonicalHostName的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicStringgetCanonicalHostName()
在访问某些域名时,getCanonicalHostName方法和getHostName方法的返回值是一样的,这和DNS服务器如何解释主机名和主机别名以及它们的设置有关。如通过www.ibm.com创建InetAddress对象后,使用getCanonicalHostName方法和getHostName方法返回的结果都是www.ibm.com(有时直接返回IP地址,这可能和IBM的DNS服务器的处理机制有关)。如果DNS不允许通过IP地址得到域名,那么这两个方法就会返回IP地址来代替域名。getCanonicalHostName方法可以分三种情况来讨论:
1. 使用getLocalHost创建InetAddress对象
在这种情况下getCanonicalHostName方法和getHostName方法得到的都是本机名。
2. 使用域名创建InetAddress对象
在这种情况下,getCanonicalHostName方法是否要访问DNS服务器,取决于DNS服务器如何解释主机名和主机别名。也就是说,是否在创建InetAddress对象时就将主机名和主机别名都确定了。在前面已经讲过,使用域名创建InetAddress对象后,调用getHostName方法不会访问DNS服务器。但getCanonicalHostName方法就不一定了。这和DNS服务器的设置有关。如www.126.com就需要访问DNS服务器,而www.ibm.com就不需要访问DNS服务器。
3.使用IP地址创建InetAddress对象
在这种情况下,getCanonicalHostName方法和getHostName方法是完全一样的,也就是说,它们得到的都是主机名,而不是主机别名。
之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如www.oracle.com。一个主机名可能对应多个主机别名,如oracle.com也是Oracle的主机别名。在IE的地址栏中输入http://
bigip-otn-portal.oracle.com和http://oracle.com都可以访问Oracle官方网站。但我们发现,有很多网站通过主机名无法访问,只有通过一些别名才能访问,如126只能通过www.126.com和126.com两个主机别名访问,而不能通过它的主机名zz-9-77-a8.bta.net.cn来访问。这是因为在服务端通过HTTP协议做了限制,这个在前面已经讨论过了。例程3-8对比了getCanonicalHostName和getHostName方法在不同情况下的输出结果。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package mynet;
importjava.net.*;
publicclass DomainName
{
publicstaticvoidoutHostName(InetAddressaddress,Strings)
{
System.out.println("通过"+s+"创建InetAddress对象");
System.out.println("主机名:"+address.getCanonicalHostName());
System.out.println("主机别名:"+address.getHostName());
System.out.println("");
}
publicstaticvoidmain(String[]args)throwsException
{
outHostName(InetAddress.getLocalHost(),"getLocalHost方法");
outHostName(InetAddress.getByName("www.ibm.com"),"www.ibm.com");
outHostName(InetAddress.getByName("www.126.com"),"www.126.com");
outHostName(InetAddress.getByName("202.108.9.77"),"202.108.9.77");
outHostName(InetAddress.getByName("211.100.26.121"),"211.100.26.121");
}
}
运行结果
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->通过getLocalHost方法创建InetAddress对象
主机名:ComputerName
主机别名:ComputerName
通过www.ibm.com创建InetAddress对象
主机名:www.ibm.com
主机别名:www.ibm.com
通过www.126.com创建InetAddress对象
主机名:zz-9-77-a8.bta.net.cn
主机别名:www.126.com
通过202.108.9.77创建InetAddress对象
主机名:zz-9-77-a8.bta.net.cn
主机别名:zz-9-77-a8.bta.net.cn
通过211.100.26.121创建InetAddress对象
主机名:211.100.26.121
主机别名:211.100.26.121
从上面的运行结果可以看出,如果InetAddress对象是通过IP地址创建的,getCanonicalHostName方法和getHostName方法的值是完全一样的,它们的值可能是主机名,也可能是IP地址。而用域名创建的InetAddress对象就不一定了,它们的值可能相同(相同的IP地址或域名),也可能不相同,如上面运行结果中的www.126.com使用这两个方法得到的值就不同。在一般情况下,我们可以使用getHostName来获得域名,因为如果使用域名来创建InetAddress对象,getHostName所得到的域名就是用来创建InetAddress对象的域名,如果使用IP地址来创建InetAddress对象,getHostName方法等价于getCanonicalHostName方法。
下一篇:Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!《银河系列原创教程》发布《Java Web开发速学宝典》出版,欢迎定购
分享到:
相关推荐
Java网络编程是开发分布式应用程序的关键技术,它涵盖了网络通信的基础概念和高级应用。...通过编写网络通信的示例程序,可以更好地理解和掌握网络编程的概念和技术,从而达到从入门到精通的目标。
### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...
Java是一种广泛使用的计算机编程...从文档中提供的内容可以看出,从Java入门到精通是一个涵盖了技术、环境配置、应用部署以及企业级应用开发等多个方面的广泛过程。掌握这些知识点对于一个Java开发者来说是至关重要的。
在探讨C# socket编程的过程中,我们首先需要了解的是如何操作IP地址,这是进行网络通信的基础。C#中的IPAddress类提供了方便的方法...对于希望从入门到精通C# socket编程的读者而言,这些内容是必须掌握的核心知识点。
Java网络编程是开发基于互联网应用的关键技术之一,而理解Internet地址是网络编程的基础。本文将深入探讨IP地址的原理和应用,尤其是IPv4和IPv6这两种主要的IP地址类型。 首先,IP地址是互联网上每个设备独一无二的...
### C_socket编程从入门到精通 #### 一、基础知识概览 在开始深入探讨C_socket编程之前,我们需要先了解一些基础概念和相关的类与方法。本文将重点介绍以下几个方面: 1. **IP地址操作类**:包括`IPAddress`类...
全面理解 Java 网络编程 - BIO、NIO、AIO 本课程旨在帮助学生全面理解 Java 网络编程中的 BIO、NIO、AIO 三剑客,掌握 RPC 编程的基础知识,并结合实战项目巩固所学。 一、网络编程三剑客 - BIO、NIO、AIO BIO...
在本资料中,《Java网络编程》第三版提供了深入浅出的讲解,旨在帮助开发者提升对这一领域的理解。 1. **基础概念**: - **网络模型**:Java网络编程基于OSI七层模型和TCP/IP四层模型。理解这些模型有助于理解网络...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
在Java中,使用Unix域协议编程时,可以利用Socket和ServerSocket类的构造函数,通过传入特定的Unix路径名来创建Unix域套接字。例如,ServerSocket的bind方法可以绑定到一个Unix路径,而Socket的connect方法可以连接...
Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。《Java网络编程实例》这本书的源代码提供了丰富的示例,帮助读者深入理解这一领域。本压缩包包含的源代码覆盖了Java网络编程的各种...
在《WINDOWS SERVER 2003从入门到精通之AD中的5种操作主机》中,你将学习到域控制器的五种角色,包括架构主机、命名主机、PDC模拟器、RID主机和基础结构主机,它们各自在活动目录中的重要性和如何进行角色转移。...
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...
### ZABBIX从入门到精通 v3.0.1 知识点概览 #### 一、Zabbix介绍 Zabbix是一款开源的企业级监控工具,主要用于网络监控、服务器监控、应用程序监控等。它通过集中化的界面来实现对IT基础设施的整体监控,并能够...
Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个实例中,我们关注的是基于Java的简单聊天应用,其中包括服务器端和客户端的实现,它们能够相互通信。通过这个实例,我们可以...
《2007年图书:JSP_JSF_Tomcat Web编程从入门到精通》这本书主要涵盖了Java服务器页面(JSP)、JavaServer Faces(JSF)以及Tomcat应用服务器在Web开发中的应用,旨在帮助初学者及有一定基础的开发者深入理解和掌握...