赞
踩
java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示。大多数其他网络类都要用到这个类,包括Socket、ServerSocket、URL、DatagramSocket、DatagramPacket等。一般地讲,它包括一个主机名和一个IP地址。
InetAddress类没有公共构造函数。实际上,InetAddress有一些静态工厂方法,可以连接到DNS服务器来解析主机。这些静态工厂方法包括下列三种:
getByName()
参数host表示指定的主机,该方法用于在给定主机名的情况下确定主机的IP地址,可以传入一个主机名得到一个InetAddress对象,还可以按IP地址反向查找,例如,如果希望得到地址208.201.239.100的主机,可以向InetAddress.getByName()传入一个点分四段地址。
getLocalHost()
创建一个表示本地主机的InetAddress对象。如果没有连接都Internet,系统也没有固定IP地址为域名,可能会看到域名我localhost,IP地址为127.0.0.1。
getByAddress()
如果你知道一个数字地址,可以由这个地址创建一个InetAddress对象,而不必使用InetAddress.getByAddress()与DNS交互。需要说明的是,在传进byte数组的时候,必须把超过127的数字转换为字节。 只有作为address参数传入的字节数组大小不合法时,才会抛出一个UnknownHostException异常。
由于DNS查找的开销可能相当大,所以InetAddress类会缓存查找的结果,一旦得到一个给定主机的地址,就不会再次查找,即使为同一个主机创建一个新的InetAddress对象,也不会再次查找地址。只要在程序运行期间IP地址没有改变,这就没有问题。 但是,也有可能刚开始尝试解析一个主机时失败,但随后再次尝试时解析会成功。出于这个原因,Java对于不成功的DNS查询只缓存10秒。 这些时间可以用系统属性networkaddress.cache.ttl和networkaddress.cache.negative.ttl来控制。前者指定成功缓存保留的秒数,后者指定失败缓存保留的秒数。-1解释为“永不过期”。除了在InetAddress类中的本地缓存,本地主机、本地域名服务器和Internet上其他地方的DNS服务器也会缓存各种查询结果,对此,Java没有提供有关的控制方法,这取决于对DNS所做的改变。
调用getByName()并提供一个IP地址串作为参数时,会为所请求的IP地址创建一个InetAddress对象,而不检查DNS。这说明,可能会为实际上不存在也无法连接的主机创建InetAddress对象。只有当请求主机名时(显式地通过getHostName()请求),才会真正完成主机名的DNS查找。
主机名要比IP地址稳定得多。只有当主机名不可用时才使用IP地址。
从主机名创建一个新的InetAddress对象被认为是一个潜在的不安全操作,因为这需要一个DNS查找。要测试一个主机能否解析,所用的特定SecurityManager方法是checkConnect():
public void checkConnect(String hostname, int port)
当port参数为-1时,这个方法检查能否调用DNS解析指定的hostname。如果port参数大于-1,这个方法检查是否允许在指定端口对指定主机建立连接。
InetAddress包含4个获取方法,可以将主机名作为字符串返回,将IP地址返回为字符串和字节数组:
public String getHostName()
public String getCanonicalHostName()
public byte[] getAddress()
public String getHostAddress()
getHostName()
得到IP地址的主机名,如果是本机则是计算机名,不是本机则是主机名,如果没有域名则是IP地址。
getCanonicalHostName()
知道主机名时也会联系DNS,可能会替换原来缓存的主机名。
getAddress()
会以网络字节顺序将IP地址作为一个字节数返回。Java没有无符号字节这种基本数据类型,值大于127的字节会当作负数。需要将字节提升我int,并做适当的调整。之所以要查看IP地址的原始字节,一个原因是想要确定地址的类型,测试返回数组的字节数可以确定处理的IPv4还是IPv6地址。
getHostAddress()
得到字符串格式的原始IP地址(点分四段格式的IP地址)。
有些IP地址和地址模式有特殊的含义。Java提供了10个方法来测试InetAddress对象是否符合其中某个标准:
public boolean isAnylocalAdress()
public boolean isLoopbackAdress()
public boolean isLinkLocalAddress()
public boolean isSiteLocalAddress()
public boolean isMulticastAddress()
public boolean isMCGlobal()
public boolean isMCNodeLocal()
public boolean isMCLinkLocal()
public boolean isMCSiteLocal()
public boolean isMCOrgLocal()
isAnylocalAdress():
如果是通配地址,方法返回true。通配地址可以匹配本地系统中的任何地址,在IPv4中,通配地址是0.0.0.0。在IPv6中,通配地址是0:0:0:0:0:0:0:0。
isLoopbackAdress()
如果是回送地址,方法返回true。回送地址直接在IP层连接同一台计算机,而不使用任务物理硬件。在IPv4中,这个地址是127.0.0.1。在IPv6中,这个回送地址是0:0:0:0:0:0:0:1。
isLinkLocalAddress()
如果地址是一个IPv6本地链接地址,方法返回true,否则返回false。
isSiteLocalAddress()
如果地址是一个IPv6本地网络地址,方法返回true,否则返回false。
isMulticastAddress()
如果地址是一个组播地址,方法返回true,否则返回false。
isMCGlobal()
如果地址是全球组播地址,方法返回true,否则返回false。
isMCNodeLocal()
如果地址是一个本地接口组播地址,方法返回true,否则返回false。
isMCLinkLocal()
如果地址是一个子网范围组播地址,方法返回true,否则返回false。
isMCSiteLocal()
如果地址是一个网站范围组播地址,方法返回true,否则返回false。
isMCOrgLocal()
如果地址是一个组织范围组播地址,方法返回true,否则返回false。
InetAddress类有两个isReachable()方法,可以测试一个特定节点对当前主机是否可达。
public boolean isReachable(int timeout) throws IOException
public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException
这些方法尝试使用traceroute查看指定地址是否可达。如果主机在timeout毫秒内响应,则方法返回true;否则返回false。如果出现网络错误则抛出IOException异常。第二个方法还允许指定从哪个本地网络接口建立连接,以及“生存时间”。
public boolean equals(Object o)
public int hasCode()
public String toString()
equals(Object o)
若与一个InetAddress对象有相同的IP地址,并不要求这两个对象有相同的主机名,就返回true,否则返回false。
hasCode()
只根据IP地址来计算,不考虑主机名。
toString()
生成的字符串有两种格式:主机名或点分四段地址。
Java使用了两个类Inet4Address和Inet6Address,来区分IPv4地址和IPv6地址:
public final class Inet4Address extends InetAddress
public final class Inet6Address extends InetAddress
大多数情况下,你确实不必考虑一个地址是IPv4还是IPv6地址,在Java程序所在的应用层,完全不需要了解。Inet6Address比超类加入了一个未出现的新方法,isIPv4CompatibleAddress():
public boolean isIPv4CompatibleAddress()
当且仅当地址实际上是填充IPv6“容器”中的一个IPv4地址时,这个方法返回true,这意味着只有最后4字节不是0。
NetworkInterface类表示一个本地IP地址。NetworkInterface类提供了一些方法可以枚举所有本地地址,并由它们创建InetAddress对象,然后这些InetAddress对象可用于创建socket、服务器socket等。
getName(String name)
表示有指定名字的网络接口。
getByInetAddress(InetAddress address)
方法返回一个NetworkInterface对象,表示与指定IP地址绑定的网络接口。
getNetworkInterfaces()
方法返回一个枚举,列出本地主机上的所有网络接口。
getInetAddresses()
一个网络接口可以绑定多个IP地址。现在情况不太常见,但确实是存在的。
getName()
返回某个特定NetworkInterface对象的名,如eth0或lo。
getDisplayName()
返回特定NetworkInterface的一个更友好的名字,如Ethernet Card 0。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。