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);
}
}
执行如下命令:
java
inet
.MyInetAddress2 www.csdn.net
运行结果:
www.csdn.net
/
211.100
.
26.124
执行如下命令:
java
inet
.MyInetAddress2
ComputerName
运行结果:
ComputerName
/
192.168
.
18.10
执行如下命令:
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
执行如下命令:
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);
}
}
执行如下命令:
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
];
}
执行如下命令:
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
可以是任何字符串。