1.1. 简介

IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础。InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。

InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。

InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。

1.2. InetAddress对象的获取

InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,有以下的方法:

static InetAddress[] getAllByName(String host)

static InetAddress getByAddress(byte[] addr)

static InetAddress getByAddress(String host,byte[] addr)

static InetAddress getByName(String host)

static InetAddress getLocalHost()

在这些静态方法中,最为常用的应该是getByName(String host)方法,只需要传入目标主机的名字,InetAddress会尝试做连接DNS服务器,并且获取IP地址的操作。代码片段如下,注意我们假设以下的代码,都是默认导入了java.net中的包,在程序的开头加上import java.net.*,否则需要指定类的全名java.net.InetAddress。

InetAddress address=InetAddress.getByName("www.baidu.com");

注意到这些方法可能会抛出的异常。如果安全管理器不允许访问DNS服务器或禁止网络连接,SecurityException会抛出,如果找不到对应主机的IP地址,或者发生其他网络I/O错误,这些方法会抛出UnknowHostException。所以需要写如下的代码:

try

{

InetAddress address=InetAddress.getByName("www.baidu.com");

System.out.println(address);

}

catch(UnknownHostException e)

{

e.printStackTrace();

}
2、一些方法

一、getHostName() 方法

    定义:public String getHostName()

    根据创建InetAddress对象的不同方式,getHostName的返回值是不同的。

1. 用 getLocalHost() 方法创建的InetAddress的对象

此时getHostName返回的是本机名

InetAddress address=InetAddress.getLocalHost();

System.out.println(address.getHostName());//返回本机名

2. 用域名创建 InetAddress对象

用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用

getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回

  1. InetAddress address=InetAddress.getByName("ZZQ");
  2. System.out.println(address.getHostName());//不必再访问DNS服务器,直接返回域名

3. 用IP地址 创建InetAddress对象

使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。

如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。

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

二、getCanonicalHostName()方法

    定义:public String getCanonicalHostName()

该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。

1. 使用 getLocalHost() 创建InetAddress对象

此时getCanonicalHostName方法和getHostName方法得到的都是本机名

2. 使用域名 创建InetAddress对象

使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器

但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名

3. 使用IP地址 创建InetAddress对象

此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。

之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-

portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如www.oracle.com

三、getHostAddress()方法

    定义:public String getHostAddress()

该方法用来得到主机的IP地址,这个IP地址可以是IPv4也可以是IPv6的

无论InetAddress对象是用哪种方式创建,getHostAddress方法都不会访问DNS服务器。

  1. public static void getHostAddressTest() throws UnknownHostException {
  2. // 输出IPv4地址
  3. InetAddress ipv4Address1 = InetAddress.getByName("1.2.3.4");
  4. System.out.println("ipv4Address1:" + ipv4Address1.getHostAddress());
  5. //ipv4Address1:1.2.3.4
  6. InetAddress ipv4Address2 = InetAddress.getByName("www.ibm.com");
  7. System.out.println("ipv4Address2:" + ipv4Address2.getHostAddress());
  8. //ipv4Address2:129.42.60.216
  9. InetAddress ipv4Address3 = InetAddress.getByName("ZZQ");
  10. System.out.println("ipv4Address3:" + ipv4Address3.getHostAddress());
  11. //ipv4Address3:192.168.1.105
  12. // 输出IPv6地址
  13. InetAddress ipv6Address1 = InetAddress.getByName("abcd:123::22ff");
  14. System.out.println("ipv6Address1:" + ipv6Address1.getHostAddress());
  15. //ipv6Address1:abcd:123:0:0:0:0:0:22ff
  16. InetAddress ipv6Address2 = InetAddress.getByName("www.neu6.edu.cn");
  17. System.out.println("ipv6Address2:" + ipv6Address2.getHostAddress());
  18. //ipv6Address2:2001:da8:9000:b255:210:5cff:fef5:ac49
  19. // 输出本机全部的IP地址
  20. InetAddress Addresses[] = InetAddress.getAllByName("ZZQ");
  21. for (InetAddress address : Addresses)
  22. System.out.println("本机地址:" + address.getHostAddress());
  23. //本机地址:192.168.1.105
  24. //本机地址:0.1.0.4
  25. //本机地址:0:0:0:0:0:0:0:1
  26. }

四、getAddress()方法

    定义:public byte[] getAddress()

该方法和getHostAddress方法唯一区别是,getHostAddress返回字符形式的IP地址,getAddress返回byte数组形式的IP地址。

  1. public static void getAddressTest() throws UnknownHostException {
  2. InetAddress address = InetAddress.getByName("www.csdn.net");
  3. byte ip[] = address.getAddress();
  4. for (byte ipSegment : ip)
  5. System.out.print(ipSegment + ".");
  6. System.out.println("");
  7. //-53.81.21.61
  8. /*
  9. * byte数组是有符号的。在Java中byte类型的取值范围是-128~127.
  10. * 如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数。
  11. * 由于Java中没有无符号byte类型,因此,要想显示正常的IP地址,必须使用int或long类型。
  12. */
  13. for (byte ipSegment : ip) {
  14. int newIPSegment = (ipSegment < 0) ? 256 + ipSegment : ipSegment;
  15. System.out.print(newIPSegment + ".");
  16. }
  17. //203.81.21.61
  18. }

InetAddress类的使用的更多相关文章

  1. java中Inetaddress类

    InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...

  2. InetAddress类

    InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示.大多数其他网络类都要用到这个类,包括Socket,ServerSocket,URL,DatagramSocket,Da ...

  3. Java基础知识强化之网络编程笔记01:InetAddress类的概述和使用

    1. InetAddress类 InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,Datagr ...

  4. Java 网络编程(四) InetAddress类

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951895.html Java 网络编程(四) InetAddress类 InetAdd ...

  5. java中的URL InetAddress类

    /* * InetAddress类: * 用于标识网络上的硬件资源,表示互联网协议(ip)地址,是java对ip地址的封装. * 其实例对象包含以数字形式保存的IP地址,主机名. * InetAddr ...

  6. InetAddress类和InetSocketAddress类

    InetAddress 类 封装计算机的 IP 地址,不包含端口号 InetAddress 类常用的方法 1 String getHostAddress() 获得 IP 地址 2 String get ...

  7. Java知多少(103)网络编程之IP地址和InetAddress类

    Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TC ...

  8. IP和java.net.InetAddress类的使用

    一.IP 1.地址格式 互联网上每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址.IP 地址使用32 位长度二进制数据标示,一般在实际中看到的大部分IP地址都是以十进制的数据形式标示的,如 ...

  9. Java学习---InetAddress类的学习

    基础知识 1.InetAddress类 在网络API套接字,InetAddress类和它的子类型对象使用域名DNS系统,处理主机名到主机IPv4或IPv6地址的转换.如图1-1所示. 由于InetAd ...

随机推荐

  1. Windows Server 2003 SP2企业版ISO下载, windows2003系统下载,2003系统下载,2003系统

    Windows Server 2003 SP2 企业版ISO下载(真正企业免激活版) 此版本适合作为一个新系统来安装,也适合在虚拟机中安装 点评:Windows Server 2003 SP2 企业版 ...

  2. Scala学习笔记--上界(<:)、视图界定(<%)、上下文界定(T:M)

    上界 下界 视界 object Test{ def main(args:Array[String]):Unit={ def mulBy(factor:Double)=(x:Double)=>fa ...

  3. [Google Code Jam (Qualification Round 2014) ] B. Cookie Clicker Alpha

    Problem B. Cookie Clicker Alpha   Introduction Cookie Clicker is a Javascript game by Orteil, where ...

  4. Liunx+C编程一站式学习

    Liunx+C编程一站式学习这本书有什么特点?面向什么样的读者?这本书最初是为某培训班的嵌入式系统Linux工程师就业班课程量身定做的教材之一.该课程是为期四个月的全日制职业培训,要求学员毕业时具备非 ...

  5. include .h 以及.cpp的记录

    VC include 路径解析要了解vc中使用#include命令包含头文件所搜寻的路径,必须先了解vc中的几种路径:1. 系统路径 系统路径在vc中是"Tools->Options- ...

  6. 关于cookie, iphone及chrome的异同

    http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html http://stackoverflow.com/questions/295 ...

  7. qt info.plist 添加

    http://www.waitingfy.com/archives/1242 http://www.sollyu.com/settings-icon-under-the-qt-mac-applicat ...

  8. Qt自定义带游标的slider,在滑块正上方显示当前值(非常有意思,继承QSlider之后增加一个QLabel,然后不断移动它)

    首先自定义QSlider的子类MyCustomSlider,如下所示. mycustomslider.h #ifndef MYCUSTOMSLIDER_H #define MYCUSTOMSLIDER ...

  9. STL中istream_iterator和ostream_iterator的基本用法

    标准程序库定义有供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入.使用这两个iterato ...

  10. <转载>C++命名空间

    原文http://blog.csdn.net/liufei_learning/article/details/5391334 一. 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由 ...