本文由 简悦 SimpRead 转码, 原文地址 www.xp.cn

Java 编程中利用 InetAddress 类确定特殊 IP 地址的方法, InetAddress 类 InetAddress 类用来封装我们前面讨论的数字式的 IP 地址和该地址的域名。

Java 编程中利用 InetAddress 类确定特殊 IP 地址的方法


InetAddress 类

InetAddress 类用来封装我们前面讨论的数字式的 IP 地址和该地址的域名。

你通过一个 IP 主机名与这个类发生作用,IP 主机名比它的 IP 地址用起来更简便更容易理解。

InetAddress 类内部隐藏了地址数字。

InetAddress 类中的工厂方法
  InetAddress 类没有明显的构造函数。为生成一个 InetAddress 对象,必须运用一个可用的工厂方法。

工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。

对于 InetAddress,三个方法: getLocalHost()、getByName() 以及 getAllByName() 可以用来创建 InetAddress 的实例。

getLocalHost() 仅返回象征本地主机的 InetAddress 对象。

本机地址还为 localhost,127.0.0.1,这三个地址都是一回事。

getByName() 方法返回一个传给它的主机名的 InetAddress。

如果这些方法不能解析主机名,它们引发一个 UnknownHostException 异常。

在 Internet 上,用一个名称来代表多个机器是常有的事。

getAllByName() 工厂方法返回代表由一个特殊名称分解的所有地址的 InetAddresses 类数组。

在不能把名称分解成至少一个地址时,它将引发一个 UnknownHostException 异常。

程序实例 
InetAddressTest01

  1. package com.example.network;
  2. import java.net.InetAddress;
  3. public class InetAddressTest01
  4. {
  5. public static void main(String[] args) throws Exception
  6. {
  7. InetAddress address = InetAddress.getLocalHost();
  8. System.out.println(address);
  9. // 输出:机器名/IP地址
  10. // 如username-PC/10.4.16.131
  11. // 通过域名得到IP地址
  12. address = InetAddress.getByName("www.sohu.com");
  13. System.out.println(address);
  14. // 输出:域名/IP地址
  15. }
  16. }

利用 InetAddress 类确定特殊 IP 地址
IP 地址分为普通地址和特殊地址。在前面的文章中所使用的大多数都是普通的 IP 地址,在本文中将介绍如何利用 InetAddress 类提供的十个方法来确定一个 IP 地址是否是一个特殊的 IP 地址。
一、isAnyLocalAddress 方法 当 IP 地址是通配符地址时返回 true,否则返回 false. 这个通配符地址对于拥有多个网络接口(如两块网卡)的计算机非常拥有。使用通配符地址可以允许在服务器主机接受来自任何网络接口的客户端连接。IPv4 的通配符地址是 0.0.0.0.IPv6 的通配符地址是 0:0:0:0:0:0:0:0,也可以简写成::。
二、isLoopbackAddress 方法 当 IP 地址是 loopback 地址时返回 true,否则返回 false.loopback 地址就是代表本机的 IP 地址。IPv4 的 loopback 地址的范围是 127.0.0.0 ~ 127.255.255.255,也就是说,只要第一个字节是 127,就是 lookback 地址。如 127.1.2.3、127.0.200.200 都是 loopback 地址。IPv6 的 loopback 地址是 0:0:0:0:0:0:0:1,也可以简写成::1. 我们可以使用 ping 命令来测试 lookback 地址。如下面的命令行所示:

运行结果:

  1. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 (注:win7下是127.200.200.200)
  2. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  3. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  4. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  5. Ping statistics for 127.200.200.200:
  6. Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
  7. Approximate round trip times in milli-seconds:
  8. Minimum = 0ms, Maximum = 0ms, Average = 0ms

虽然 127.255.255.255 也是 loopback 地址,但 127.255.255.255 在 Windows 下是无法 ping 通的。这是因为 127.255.255.255 是广播地址,在 Windows 下对发给广播地址的请求不做任何响应,而在其他操作系统上根据设置的不同,可能会得到不同的结果。
三、isLinkLocalAddress 方法 当 IP 地址是本地连接地址(LinkLocalAddress)时返回 true,否则返回 false.IPv4 的本地连接地址的范围是 169.254.0.0 ~ 169.254.255.255.IPv6 的本地连接地址的前 12 位是 FE8,其他的位可以是任意取值,如 FE88::、FE80::ABCD::都是本地连接地址。
四、isSiteLocalAddress 方法 当 IP 地址是地区本地地址(SiteLocalAddress)时返回 true,否则返回 false.IPv4 的地址本地地址分为三段:10.0.0.0 ~ 10.255.255.255、172.16.0.0 ~ 172.31.255.255、192.168.0.0 ~ 192.168.255.255.IPv6 的地区本地地址的前 12 位是 FEC,其他的位可以是任意取值,如 FED0::、FEF1::都是地区本地地址。
五、isMulticastAddress 方法 当 IP 地址是广播地址(MulticastAddress)时返回 true,否则返回 false. 通过广播地址可以向网络中的所有计算机发送信息,而不是只向一台特定的计算机发送信息。IPv4 的广播地址的范围是 224.0.0.0 ~ 239.255.255.255.IPv6 的广播地址第一个字节是 FF,其他的字节可以是任意值。关于广播地址的详细内容将在以后的章节中讨论。
六、isMCGlobal 方法 当 IP 地址是全球范围的广播地址时返回 true,否则返回 false. 全球范围的广播地址可以向 Internet 中的所有的计算机发送信息。IPv4 的广播地址除了 224.0.0.0 和第一个字节是 239 的 IP 地址都是全球范围的广播地址。IPv6 的全球范围的广播地址中第一个字节是 FF,第二个字节的范围是 0E ~ FE,其他的字节可以是任意值,如 FFBE::、FF0E::都是全球范围的广播地址。
七、isMCLinkLocal 方法 当 IP 地址是子网广播地址时返回 true,否则返回 false. 使用子网的广播地址只能向子网内的计算机发送信息。IPv4 的子网广播地址的范围是 224.0.0.0 ~ 224.0.0.255.IPv6 的子网广播地址的第一个字节是 FF,第二个字节的范围是 02 ~ F2,其他的字节可以是任意值,如 FFB2::、FF02:ABCD::都是子网广播地址。
八、isMCNodeLocal 方法 当 IP 地址是本地接口广播地址时返回 true,否则返回 false. 本地接口广播地址不能将广播信息发送到产生广播信息的网络接口,即使是同一台计算机的另一个网络接口也不行。所有的 IPv4 广播地址都不是本地接口广播地址。IPv6 的本地接口广播地址的第一个字节是 FF,第二个节字的范围是 01 ~ F1,其他的字节可以是任意值,如 FFB1::、FF01:A123::都是本地接口广播地址。
九、isMCOrgLocal 方法 当 IP 地址是组织范围的广播地址时返回 ture,否则返回 false. 使用组织范围广播地址可以向公司或企业内部的所有的计算机发送广播信息。IPv4 的组织范围广播地址的第一个字节是 239,第二个字节不小于 192,第三个字节不大于 195,如 239.193.100.200、239.192.195.0 都是组织范围广播地址。IPv6 的组织范围广播地址的第一个字节是 FF,第二个字节的范围是 08 ~ F8,其他的字节可以是任意值,如 FF08::、FF48::都是组织范围的广播地址。
十、isMCSiteLocal 方法 当 IP 地址是站点范围的广播地址时返回 true,否则返回 false. 使用站点范围的广播地址,可以向站点范围内的计算机发送广播信息。IPv4 的站点范围广播地址的范围是 239.255.0.0 ~ 239.255.255.255,如 239.255.1.1、239.255.0.0 都是站点范围的广播地址。IPv6 的站点范围广播地址的第一个字节是 FF,第二个字节的范围是 05 ~ F5,其他的字节可以是任意值,如 FF05::、FF45::都是站点范围的广播地址。

下面的代码可以确定一个 IP 地址是否在上述十种地址类型的范围内:

  1. package test;
  2. import java.net.*;
  3. import java.lang.reflect.*;
  4. public class MyNet
  5. {
  6. public static void main(String[] args) throws Exception
  7. {
  8. if (args.length == 0)
  9. return;
  10. InetAddress address = InetAddress.getByName(args[0]);
  11. Method methods[] = InetAddress.class.getMethods();
  12. // 以is开头并且没有参数的方法
  13. for (Method method : methods)
  14. {
  15. if (method.getName().matches("is.*") && method.getParameterTypes().length == 0)
  16. {
  17. if (Boolean.parseBoolean(method.invoke(address).toString()))
  18. System.out.println(method.getName() + " = true");
  19. }
  20. }
  21. }
  22. }

测试 1
执行如下命令:

  1. java test.MyNet 224.0.0.1

运行结果:

  1. isMCLinkLocal = true
  2. isMulticastAddress = true

测试 2
执行如下命令:

运行结果:

  1. isMCNodeLocal = true
  2. isMulticastAddress = true


相关阅读:
ThinkPHP 模板判断输出 Defined 标签用法详解
Asp.net 中时间格式化的 6 种方法详细总结
删除 sqlserver 数据库日志和没有日志的数据库恢复办法
php 获取文件内容最后一行示例
Linux 中安装使用 http_load 对服务器进行压力测试的教程
php 时间戳转换的示例
css 常用代码分享 (css 圆角代码、渐变、密码框)
在 ubuntu14.04 下使用网页版 qq 的方法图文介绍
在 jsp 页面如何获得 url 参数
Win10 休眠文件 hiberfil.sys 怎么彻底删除?
Javascript 基础教程之数据类型 (布尔型 Boolean)
巧用 jQuery 选择器提高写表单效率的方法
AngularJS 中的事件详解
Win7/Win8.1 用户: 全新安装 Win10 之前请先升级