`
xangqun
  • 浏览: 80220 次
  • 性别: 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方法。
分享到:
评论

相关推荐

    Oracle11g从入门到精通2

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

    Java网络编程获取主机信息

    Java网络编程获取主机信息,内有简单界面操作,能够实现获取本地主机以及联网后其他主机的详细信息.很好用!

    Java socket编程实现两台主机间的通信

    Java Socket 编程实现两台主机间的通信 Java Socket 编程是 Java 语言中用于实现网络通信的编程技术。通过使用 Socket 编程,可以实现两台主机之间的通信,实现数据的传输和交换。本文将详细介绍 Java Socket 编程...

    搜索引擎优化(SEO)从入门到精通

    搜索引擎优化(SEO)从入门到精通内容简介:第一部分 正确认识搜索引擎优化 第二部分 域名对SEO的影响 域名及网站名称 域名及网站名称中的关键词 域名后缀 过期域名 域名注册二级域名 第三部分 主机对SEO的...

    WindowsServer2003从入门到精通系列文档

    教程名称:Windows Server 2003 从入门到精通系列文档课程目录:【】WIN2003之“加入域提示找不到网络路径活动目录缺少dns记录”【】WIN2003之“域控制器安全策略”打开错误的解决方法【】WIN2003从入门到精通之域...

    Oracle11g从入门到精通

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

    《Linux从入门到精通》

    Linux操作系统入门书,比较全面 目录 0 前言 0.1 什么是Linux? 0.2 本手册概述 0.3 速查信息 0.4 从以前版本的Red Hat Linux升级 0.5 开发者的话 0.6 编者的话 1 Red Hat Linux 5.1新特性 1.1 安装性能的...

    Linux运维-操作系统 教程 从入门到精通101课-48-48网络命令-主机名与DNS.mp4

    Linux运维-操作系统 教程 从入门到精通101课-48-48网络命令-主机名与DNS.mp4

    WF从入门到精通(第十七章):关联及本地主机通信(上)源码

    WF从入门到精通(第十七章):关联及本地主机通信(上)源码

    C#编程方法:获取本机主机名和IP地址

    C#编程方法:获取本机主机名和IP地址C#编程方法:获取本机主机名和IP地址

    VisualC 实效编程 91 获得主机名和IP地址

    VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC ...

    zabbix教程:zabbix从放弃到入门

    zabbix教程:zabbix从放弃到入门(6):触发器、事件、动作 相关概念 zabbix教程:zabbix从放弃到入门(7):触发器详解之一 zabbix教程:zabbix从放弃到入门(8):触发器详解之二 zabbix教程:zabbix从放弃到入门...

    java网络编程技术课程设计.doc

    在Internet上IP地址和主机名是一一对应的,通过域名解析可以由主机名得到机器的IP ,由于机器名更接近自然语言,容易记忆,所以使用比IP地址广泛,但是对机器而言只有 IP地址才是有效的标识符。 光用主机名或IP地址...

    Redis从入门到精通(深入剖析)【55集完整资料】49-redis-redis的主从复制-读写分离、主机宕机.avi

    Redis从入门到精通高清,迅雷播放器组件可顺利播放

    第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社.pptx

    端到端的传输协议TCP 主机 A 主机 B 建立连接 数据传输 释放连接 第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社全文共17页,当前为第6页。 UDP 在传送数据之前不需要先建立连接。...

    7.如何获取主机名和IP地址?(Visual C++编程 源代码)

    7.如何获取主机名和IP地址?(Visual C++编程 源代码)7.如何获取主机名和IP地址?(Visual C++编程 源代码)7.如何获取主机名和IP地址?(Visual C++编程 源代码)7.如何获取主机名和IP地址?(Visual C++编程 源...

    Oracle.11g.从入门到精通 (2/2)

    7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 8.1.4 使用ALTERUSER语句修改 用户的默认角色 8.1.5 使用SET ROLE控制...

    Oracle.11g.从入门到精通 (1/2)

    7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 8.1.4 使用ALTERUSER语句修改 用户的默认角色 8.1.5 使用SET ROLE控制...

    Java网络聊天室

    Java网络聊天室简介:程序能够连接他人主机(局域网内)、能够进行用户的注册、登录、用户密码的修改;同时能够给对方发送文字内容,并且能够显示聊天时间;局域网内聊天不能超过50个连接(因为服务器套接字...

    Nginx开发从入门到精通

    Nginx开发从入门到精通,需要循序渐进地学习和掌握以下几个方面的知识: 1. Nginx基础知识:了解Nginx的安装、配置和运行原理,熟悉Nginx的核心模块和指令,掌握Nginx的基本使用。 2. Nginx作为Web服务器:配置Nginx作为...

Global site tag (gtag.js) - Google Analytics