`
xangqun
  • 浏览: 82626 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

Java网络编程从入门到精通(6):使用getCanonicalHostName方法获得主机名

阅读更多
getCanonicalHostName方法和getHostName方法一样,也是得到远程主机的域名。但它们有一个区别。getCanonicalHostName得到的是主机名,而getHostName得到的主机别名。getCanonicalHostName的定义如下:

public String getCanonicalHostName()

在访问某些域名时,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方法在不同情况下的输出结果。


package mynet;

import java.net.*;

public class DomainName
{
    public static void outHostName(InetAddress address, String s)
    {
        System.out.println("通过" + s + "创建InetAddress对象");
        System.out.println("主 机 名:" + address.getCanonicalHostName());
        System.out.println("主机别名:" + address.getHostName());
        System.out.println("");
    }
    public static void main(String[] args) throws Exception
    {
        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");
    }
}


    运行结果


通过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 网络编程从入门到精通

    Java网络编程是开发分布式应用程序的关键技术,它涵盖了网络通信的基础概念和高级应用。...通过编写网络通信的示例程序,可以更好地理解和掌握网络编程的概念和技术,从而达到从入门到精通的目标。

    JAVA网络编程从入门到精通

    ### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...

    Java学习从入门到精通.pdf

    Java是一种广泛使用的计算机编程...从文档中提供的内容可以看出,从Java入门到精通是一个涵盖了技术、环境配置、应用部署以及企业级应用开发等多个方面的广泛过程。掌握这些知识点对于一个Java开发者来说是至关重要的。

    C#socket编程从入门到精通

    在探讨C# socket编程的过程中,我们首先需要了解的是如何操作IP地址,这是进行网络通信的基础。C#中的IPAddress类提供了方便的方法...对于希望从入门到精通C# socket编程的读者而言,这些内容是必须掌握的核心知识点。

    Java网络编程从入门到精通(1):Internet地址概述 所有连入Internet的 ....doc

    Java网络编程是开发基于互联网应用的关键技术之一,而理解Internet地址是网络编程的基础。本文将深入探讨IP地址的原理和应用,尤其是IPv4和IPv6这两种主要的IP地址类型。 首先,IP地址是互联网上每个设备独一无二的...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    全面理解 Java 网络编程 - BIO、NIO、AIO 本课程旨在帮助学生全面理解 Java 网络编程中的 BIO、NIO、AIO 三剑客,掌握 RPC 编程的基础知识,并结合实战项目巩固所学。 一、网络编程三剑客 - BIO、NIO、AIO BIO...

    C_socket编程从入门到精通

    ### C_socket编程从入门到精通 #### 一、基础知识概览 在开始深入探讨C_socket编程之前,我们需要先了解一些基础概念和相关的类与方法。本文将重点介绍以下几个方面: 1. **IP地址操作类**:包括`IPAddress`类...

    java网络编程

    在本资料中,《Java网络编程》第三版提供了深入浅出的讲解,旨在帮助开发者提升对这一领域的理解。 1. **基础概念**: - **网络模型**:Java网络编程基于OSI七层模型和TCP/IP四层模型。理解这些模型有助于理解网络...

    Java网络编程期末考试复习题库+答案

    Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...

    Java网络编程--Unix域协议:概述

    在Java中,使用Unix域协议编程时,可以利用Socket和ServerSocket类的构造函数,通过传入特定的Unix路径名来创建Unix域套接字。例如,ServerSocket的bind方法可以绑定到一个Unix路径,而Socket的connect方法可以连接...

    Java网络编程实例(随书源代码)

    Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。《Java网络编程实例》这本书的源代码提供了丰富的示例,帮助读者深入理解这一领域。本压缩包包含的源代码覆盖了Java网络编程的各种...

    WINDOWS SERVER 2003从入门到精通.rar

    在《WINDOWS SERVER 2003从入门到精通之AD中的5种操作主机》中,你将学习到域控制器的五种角色,包括架构主机、命名主机、PDC模拟器、RID主机和基础结构主机,它们各自在活动目录中的重要性和如何进行角色转移。...

    Oracle11g从入门到精通2

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    ZABBIX从入门到精通v3.0.1 pdf

    ### ZABBIX从入门到精通 v3.0.1 知识点概览 #### 一、Zabbix介绍 Zabbix是一款开源的企业级监控工具,主要用于网络监控、服务器监控、应用程序监控等。它通过集中化的界面来实现对IT基础设施的整体监控,并能够...

    Java 网络编程实例

    Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个实例中,我们关注的是基于Java的简单聊天应用,其中包括服务器端和客户端的实现,它们能够相互通信。通过这个实例,我们可以...

    2007年图书:JSP_JSF_Tomcat Web编程从入门到精通

    《2007年图书:JSP_JSF_Tomcat Web编程从入门到精通》这本书主要涵盖了Java服务器页面(JSP)、JavaServer Faces(JSF)以及Tomcat应用服务器在Web开发中的应用,旨在帮助初学者及有一定基础的开发者深入理解和掌握...

Global site tag (gtag.js) - Google Analytics