Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Java网络编程从入门到精通(4):DNS缓存 该方法可以得到远程主机的域名,也可以得到本机名。

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(4):DNS缓存

该方法可以得到远程主机的域名,也可以得到本机名。getHostName方法的定义如下:

public  String getHostName()

    下面是三种创建InetAddress对象的方式,在这三种方式中,getHostName返回的值是不同的。

1使用getLocalHost方法创建InetAddress对象

如果InetAddress对象是用getLocalHost方法创建的,getHostName返回的是本机名。如下面的代码所示:

InetAddress address  =  InetAddress.getLocalHost();
System.out.println(address.getHostName());  
//  输出本机名

2使用域名创建InetAddress对象

用域名作为getByNamegetAllByName方法的参数调用这两个方法后,系统会自动记住这个域名。当调用getHostName方法时,就无需再访问DNS服务器,而是直接将这个域名返回。如下面的代码所示:

InetAddress address  =  InetAddress.getByName( " www.oracle.com " );
System.out.println(address.getHostName());  
//  无需访问DNS服务器,直接返回域名

3使用IP地址创建InetAddress对象

使用IP地址创建InetAddress对象时(getByNamegetAllByNamegetByAddress方法都可以通过IP地址创建InetAddress对象),并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。如果这个IP地址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。如下面的代码所示:

InetAddress address  =  InetAddress.getByName( " 141.146.8.66 " );
System.out.println(address.getHostName());  
//  需要访问DNS服务器才能得到域名
InetAddress address  =  InetAddress.getByName( " 1.2.3.4 " );   //  IP地址不存在
System.out.println(address.getHostName());   //  直接返回IP地址

    从上面的三种情况可以看出,只有通过使用IP地址创建的InetAddress对象调用getHostName方法时才访问DNS服务器。在其他情况,getHostName方法并不会访问DNS服务器,而是直接将域名或本机名返回。下面的代码演示了在不同情况下如何使用getHostName方法,并计算了各种情况所需的毫秒数。

   package mynet;
  
  
import  java.net. * ;
  
  
public   class DomainName
  {
      
public   static   void  main(String[] args)  throws  Exception
      {
          
long  time  =   0 ;
          
//  得到本机名
          InetAddress address1  =  InetAddress.getLocalHost();
          System.out.println(
" 本机名:  "   +  address1.getHostName());
          
//  直接返回域名
          InetAddress address2  =  InetAddress.getByName( " www.oracle.com " );
          time 
=  System.currentTimeMillis();
          System.out.print(
" 直接得到域名:  "   +  address2.getHostName());
          System.out.println(
"   所用时间: "
                          
+  String.valueOf(System.currentTimeMillis()  -  time)  +   "  毫秒 " );
          
//  通过DNS查找域名
          InetAddress address3  =  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地址
      }
  }   

    运行结果:

本机名: 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.combigip-otn-portal.oracle.com都是oracle的域名,我们也可以通过http:// bigip-otn-portal.oracle.com来访问oracle的官方网站。至于这两个域名有什么区别,将在下面的文章中讨论。

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



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
3月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
331 18
|
3月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
244 4
|
4月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
183 11
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
239 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
256 1
|
3月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
337 5
|
4月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
3月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
436 0
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
304 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
248 10