Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法

InetAddress类是Java中用于描述IP地址的类。它在java.net包中。在Java中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址。这两个类都是InetAddress的子类。由于InetAddress没有public的构造方法,因此,要想创建InetAddress对象,必须得依靠它的四个静态方法。InetAddress可以通过getLocalHost方法得到本机的InetAddress对象,也可以通过getByName、getAllByName和getByAddress得到远程主机的InetAddress对象。

一、getLocalHost方法

使用getLocalHost可以得到描述本机IP的InetAddress对象。这个方法的定义如下:

public static InetAddress getLocalHost() throws UnknownHostException

这个方法抛出了一个UnknownHostException异常,因此,必须在调用这个方法的程序中捕捉或抛出这个异常。下面的代码演示了如何使用getLocalHost来得到本机的IP和计算机名。

package inet;

import java.net.*;

public class MyInetAddress1
{
    public static void main(String[] args) throws Exception
    {
        InetAddress localAddress = InetAddress.getLocalHost();
        System.out.println(localAddress);        
    }
}

运行结果:

ComputerName/192.168.18.10

在InetAddress类中覆盖了Object类的toString方法,实现如下:

public String toString() 
{
     return ((hostName != null) ? hostName : "") + "/" + getHostAddress();
}

从上面的代码可以看出,InetAddress方法中的toString方法返回了用“/“隔开的主机名和IP地址。因此,在上面的代码中直接通过localAddress对象来输出本机计算机名和IP地址(将对象参数传入println方法后,println方法会调用对象参数的toString方法来输出结果)。

当本机绑定了多个IP时,getLocalHost只返回第一个IP。如果想返回本机全部的IP,可以使用getAllByName方法。

二、getByName方法

这个方法是InetAddress类最常用的方法。它可以通过指定域名从DNS中得到相应的IP地址。getByName一个String类型参数,可以通过这个参数指定远程主机的域名,它的定义如下:

public static InetAddress getByName(String host) throws UnknownHostException

如果host所指的域名对应多个IP,getByName返回第一个IP。如果本机名已知,可以使用getByName方法来代替getLocalHost。当host的值是localhost时,返回的IP一般是127.0.0.1。如果host是不存在的域名,getByName将抛出UnknownHostException异常,如果host是IP地址,无论这个IP地址是否存在,getByName方法都会返回这个IP地址(因此getByName并不验证IP地址的正确性)。下面代码演示了如何使用getByName方法:

package inet;
  
  import java.net.*;
  
  public class MyInetAddress2
  {
      public static void main(String[] args) throws Exception
      {
          if (args.length == 0)
              return;
          String host = args[0];
          InetAddress address = InetAddress.getByName(host);
          System.out.println(address);
      }
  }

  • 测试1:远程主机www.csdn.net

执行如下命令:

java inet.MyInetAddress2 www.csdn.net

运行结果:

www.csdn.net/211.100.26.124

  • 测试2:本机名ComputerName

执行如下命令:

java inet.MyInetAddress2 ComputerName

运行结果:

ComputerName/192.168.18.10

  • 测试3:代表本机的localhost

执行如下命令:

java inet.MyInetAddress2 localhost

运行结果:

localhost/127.0.0.1

对于本机来说,除了可以使用本机名或localhost外,还可以在hosts文件中对本机做“IP/域名”映射(在Windows操作系统下)。这个文件在C:\WINDOWS\system32\drivers\etc中。打开这两个文件中,在最后加一行如下所示的字符串:

192.168.18.100   www.mysite.com

  • 测试4:本机域名www.mysite.com

执行如下命令:

java inet.MyInetAddress2 www.mysite.com

运行结果:

www.mysite.com/192.168.18.100

getByName方法除了可以使用域名作为参数外,也可以直接使用IP地址作为参数。如果使用IP地址作为参数,输出InetAddress对象时域名为空(除非调用getHostName方法后,再输出InetAddress对象。getHostName方法将在下面的内容介绍)。读者可以使用129.42.58.212作为MyInetAddress2的命令行参数(这是www.ibm.com的IP),看看会得到什么结果。

三、getAllByName方法

使用getAllByName方法可以从DNS上得到域名对应的所有的IP。这个方法返回一个InetAddress类型的数组。这个方法的定义如下:

public static InetAddress[] getAllByName(String host) throws UnknownHostException

与getByName方法一样,当host不存在时,getAllByName也会抛出UnknowHostException异常,getAllByName也不会验证IP地址是否存在。下面的代码演示了getAllByName的用法:

package inet;
  
  import java.net.*;
  
  public class MyInetAddress3
  {
      public static void main(String[] args) throws Exception
      {
          if (args.length == 0)
              return;
          String host = args[0];
          InetAddress addresses[] = InetAddress.getAllByName(host);
          for (InetAddress address : addresses)
              System.out.println(address);
      }
  }

  • 测试1:远程主机www.csdn.net

执行如下命令:

java inet.MyInetAddress3 www.csdn.net

运行结果:

www.csdn.net/211.100.26.124
www.csdn.net/211.100.26.121
www.csdn.net/211.100.26.122
www.csdn.net/211.100.26.123

将上面的运行结果和例程3-2的测试1的运行结果进行比较,可以得出一个结论,getByName方法返回的IP地址就是getAllByName方法返回的第一个IP地址。事实上,getByName的确是这样实现的,getByName的实现代码如下:

public static InetAddress getByName(String host) throws UnknownHostException
{
     return InetAddress.getAllByName(host)[0];
}

  • 测试2:使用www.csdn.net的一个IP 

执行如下命令:

java inet.MyInetAddress3 211.100.26.122

运行结果:

/211.100.26.122

四、getByAddress方法

这个方法必须通过IP地址来创建InetAddress对象,而且IP地址必须是byte数组形式。getByAddress方法有两个重载形式,定义如下:

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

第一个重载形式只需要传递byte数组形式的IP地址,getByAddress方法并不验证这个IP地址是否存在,只是简单地创建一个InetAddress对象。addr数组的长度必须是4(IPv4)或16(IPv6),如果是其他长度的byte数组,getByAddress将抛出一个UnknownHostException异常。第二个重载形式多了一个host,这个host和getByName、getAllByName方法中的host的意义不同,getByAddress方法并不使用host在DNS上查找IP地址,这个host只是一个用于表示addr的别名。下面的代码演示了getByAddress的两个重载形式的用法:

package inet;
  
  import java.net.*;
  
  public class MyInetAddress4
  {
      public static void main(String[] args) throws Exception
      {
          byte ip[] = new byte[] { (byte) 141, (byte) 146, 8 , 66};
          InetAddress address1 = InetAddress.getByAddress(ip);
          InetAddress address2 = InetAddress.getByAddress("Oracle官方网站", ip);
          System.out.println(address1);
          System.out.println(address2);
      }
  }

上面代码的运行结果如下:

/141.146.8.66
Oracle官方网站/141.146.8.66

从上面的运行结果可以看出,getByAddress只是简单地将host参数作为域名放到“/”前面,因此,host可以是任何字符串。

时间: 2024-10-25 21:58:30

Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法的相关文章

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

在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作.在Java中为了缓解这个问题,提供了DNS缓存.当InetAddress类第一次使用某个域名(如www.csdn.net)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中.当下一次InetAddress类再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器. DNS缓存在默认时将永

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

该方法可以得到远程主机的域名,也可以得到本机名.getHostName方法的定义如下: public String getHostName() 下面是三种创建InetAddress对象的方式,在这三种方式中,getHostName返回的值是不同的. 1.使用getLocalHost方法创建InetAddress对象 如果InetAddress对象是用getLocalHost方法创建的,getHostName返回的是本机名.如下面的代码所示: InetAddress address = InetA

Java网络编程从入门到精通(11):使用NetworkInterface类获得网络接口信息

从JDK1.4开始,Java提供了一个NetworkInterface类.这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息. 一.创建NetworkInterface对象的两个静态方法 NetworkInerface类和InetAddress一样,也没有public的构造方法.因此,必须通过它的两个静态方法来创建NetworkInterface对象.可以使用两种方法来创建NetworkInterface对象:网络接口名(getByName方法)和I

Java网络编程从入门到精通(14):多种多样的建立网络连接的方式

在上一篇文章中我们讨论了Socket类的基本用法,并给出的例子中使用Socket类连接服务器时使用了一种最简单的连接方式,也就是通过IP和端口号来连接服务器.而为了使连接服务器的方式更灵活,Socket类不仅可以通过自身的构造方法连接服务器,而且也可以通过connect方法来连接数据库. 一.通过构造方法连接服务器 我们可以通过6个重载构造函数以不同的方式来连接服务器.这6个重载的构造函数可以分为两类: 1. 自动选择IP     这种方式是最常用的.所谓自动选择IP,是指当本机有多块网卡或者在

Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)

在Java类中,getter和setter方法占了很大的比重.由于Java中没有定义属性的关键字:因此,getter和setter方法用于获得和设置Java类的属性值:如getName和setName方法用于设置name属性的值.如果某个属性只有getter方法,那这个属性是只读的:如果只有setter方法,那么这个属性是只写的.在Socket类中也有很多这样的属性来获得和Socket相关的信息,以及对Socket对象的状态进行设置. 一.用于获得信息的getter方法 我们可以从Socket对

Java网络编程从入门到精通 (9):使用isXxx方法判断地址类型

IP地址分为普通地址和特殊地址.在前面的文章中所使用的大多数都是普通的IP地址,在本文中将介绍如何利用InetAddress类提供的十个方法来确定一个IP地址是否是一个特殊的IP地址. 一.isAnyLocalAddress方法 当IP地址是通配符地址时返回true,否则返回false.这个通配符地址对于拥有多个网络接口(如两块网卡)的计算机非常拥有.使用通配符地址可以允许在服务器主机接受来自任何网络接口的客户端连接.IPv4的通配符地址是0.0.0.0.IPv6的通配符地址是0:0:0:0:0

Java网络编程从入门到精通(18):Socket类的getter和setter方法(2)

二.用于获得和设置Socket选项的getter和setter方法 Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: public final static int TCP_NODELAY = 0x0001;    public final static int SO_REUSEADDR = 0x04;    public final static int

Java网络编程从入门到精通(16):客户端套接字(Socket)的超时

客户端套接字的超时(timeout)就是指在客户端通过Socket和服务器进行通讯的过程中,由于网络延迟,网络阻塞等原因,造成服务器并未及时响应客户端的一种现象.在一段时间后,客户端由于未收到服务端的响应而抛出一个超时错误; 其中客户端所等待的时间就是超时时间. 由于生产超时错误的一端都是被动端:也就是说,这一端是在接收数据,而不是发送数据.对于客户端Socket来说,只有两个地方是在接收数据:一个是在连接服务器时;另一个是在连接服务器成功后,接收服务器发过来的数据时.因此,客户端超时也分为两种

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.         连接服务器 2.         发送