本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇: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开发速学宝典》出版,欢迎定购
分享到:
相关推荐
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...
Java网络编程获取主机信息,内有简单界面操作,能够实现获取本地主机以及联网后其他主机的详细信息.很好用!
C#编程方法:获取本机主机名和IP地址C#编程方法:获取本机主机名和IP地址
搜索引擎优化(SEO)从入门到精通内容简介:第一部分 正确认识搜索引擎优化 第二部分 域名对SEO的影响 域名及网站名称 域名及网站名称中的关键词 域名后缀 过期域名 域名注册二级域名 第三部分 主机对SEO的...
教程名称:Windows Server 2003 从入门到精通系列文档课程目录:【】WIN2003之“加入域提示找不到网络路径活动目录缺少dns记录”【】WIN2003之“域控制器安全策略”打开错误的解决方法【】WIN2003从入门到精通之域...
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...
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
WF从入门到精通(第十七章):关联及本地主机通信(上)源码
VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC 实效编程 91 获得主机名和IP地址VisualC ...
zabbix教程:zabbix从放弃到入门(6):触发器、事件、动作 相关概念 zabbix教程:zabbix从放弃到入门(7):触发器详解之一 zabbix教程:zabbix从放弃到入门(8):触发器详解之二 zabbix教程:zabbix从放弃到入门...
在Internet上IP地址和主机名是一一对应的,通过域名解析可以由主机名得到机器的IP ,由于机器名更接近自然语言,容易记忆,所以使用比IP地址广泛,但是对机器而言只有 IP地址才是有效的标识符。 光用主机名或IP地址...
Redis从入门到精通高清,迅雷播放器组件可顺利播放
端到端的传输协议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.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控制...
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网络聊天室简介:程序能够连接他人主机(局域网内)、能够进行用户的注册、登录、用户密码的修改;同时能够给对方发送文字内容,并且能够显示聊天时间;局域网内聊天不能超过50个连接(因为服务器套接字...
Nginx开发从入门到精通,需要循序渐进地学习和掌握以下几个方面的知识: 1. Nginx基础知识:了解Nginx的安装、配置和运行原理,熟悉Nginx的核心模块和指令,掌握Nginx的基本使用。 2. Nginx作为Web服务器:配置Nginx作为...
03-zabbix架构讲解和添加监控主机 04-自定义监控项快速入门 05-自定义触发器快速入门 06-zabbix报警快速入门 zabbix-day2 01-linux模板的监控项介绍 02-zabbix内置key讲解 03-tcp11状态监控 04-自定义监控项深入1 05...