TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
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:WINDOWSsystem32driversetc
中。打开这两个文件中,在最后加一行如下所示的字符串:
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
可以是任何字符串。
本文出自 “软件改变整个宇宙” 博客,请务必保留此出处http://androidguy.blog.51cto.com/974126/214818
源码下载:http://file.javaxxz.com/2014/11/7/000439203.zip |
|