Java API研究:获取本地环境所有网卡及每个网卡的所有网络配置

  一个网卡(不太标准,应该叫做一个网络接口,一个网卡是可以拥有多个网络接口的,如SoftAP)拥有一套网络配置:ip地址,子网掩码,网关,dns等等。

  自java 1.6开始,提供了访问网络配置的一些接口:

  java.net.NetworkInterface(自1.4开始)

  此类表示一个由名称和分配给此接口的 IP 地址列表组成的网络接口。它用于标识加入多播组的本地接口。 接口通常是按名称(如 "le0")区分的。  

  java.net.InterfaceAddress(自1.6开始)

  此类表示网络接口地址。简言之,对于 IPv4 地址,是指 IP 地址、子网掩码和广播地址。对于 IPv6 地址,是指 IP 地址和网络前缀长度。

  java.net.InetAddress与子类Inet4Address、Inet6Address

  地址分为组播地址,回送地址,单播地址(真正取本机IP时用这个取)

 

其中方法详解:java.net.NetworkInterface

 boolean equals(Object obj) 将此对象与指定对象比较。
static NetworkInterface getByInetAddress(InetAddress addr) 一个便捷方法,搜索绑定了指定 Internet 协议 (IP) 地址的网络接口。
static NetworkInterface getByName(String name) 搜索具有指定名称的网络接口。
 String getDisplayName() 获取此网络接口的显示名称。
 byte[] getHardwareAddress()  如果存在硬件地址并可以使用给定的当前权限访问,则返回该硬件地址(通常是 MAC)。
Enumeration<InetAddress> getInetAddresses() 一个便捷方法,返回一个具有绑定到此网络接口全部或部分 InetAddress 的 Enumeration。
List<InterfaceAddress> getInterfaceAddresses()   获取此网络接口的全部或部分 InterfaceAddresses 所组成的列表。
 int getMTU()  返回此接口的最大传输单元(Maximum Transmission Unit,MTU)。
 String getName()  获取此网络接口的名称。

static Enumeration<NetworkInterface>

getNetworkInterfaces() 返回此机器上的所有接口。
 NetworkInterface getParent() 如果此接口是子接口,则返回它的父 NetworkInterface;如果它是物理(非虚拟)接口或没有父接口,则返回 null
Enumeration<NetworkInterface> getSubInterfaces() 获取具有连接到此网络接口的所有子接口(也称虚拟接口)的 Enumeration。
 int hashCode() 返回该对象的哈希码值。
 boolean isLoopback() 返回网络接口是否是回送接口。
 boolean isPointToPoint() 返回网络接口是否是点对点接口。
 boolean isUp() 返回网络接口是否已经开启并运行。
 boolean isVirtual()  返回此接口是否是虚拟接口(也称为子接口)。
 boolean supportsMulticast()  返回网络接口是否支持多址广播。
 String toString() 返回该对象的字符串表示。

  需要特别关注的是:

  1、getNetworkInterfaces(),此静态方法用去获取所有本机的NetworkInterface,这个是获取地址的第一步,通过遍历此返回值的枚举,来获取本机所有网卡的地址。

  2、其余的非静态方法,都是一个NetworkInterface实例的方法。

  3、取到实例之后,可以判断是否是回送地址,是的情况下可排除。是否是虚拟接口,是的情况下可排除。是否开启并运行,否的情况下可排除。

  4、一个物理网卡下,可有多个虚拟接口,有两个方法就是获取这些虚拟接口的。

  5、获取网卡名(如Linux下的eth0)getDisplayName(),getName(). 获取mac地址:getHardwareAddress() 

  6、取InterfaceAddress实例。getInterfaceAddresses() ,返回一个InterfaceAddress的List,是该NetworkInterface下所有的InterfaceAddress。

  7、若想跳过取InterfaceAddress直接取IP地址,可调用getInetAddresses() 方法,返回的是一个InetAddress的枚举。

  InterfaceAddress

 boolean equals(Object obj)  将此对象与指定对象比较。
 InetAddress getAddress() 返回此地址的 InetAddress
 InetAddress getBroadcast() 返回此 InterfaceAddress 广播地址的 InetAddress
 short getNetworkPrefixLength() 返回此地址的网络前缀长度。用来取子网掩码
 int hashCode() 返回此接口地址的哈希码。
 String toString()  将此接口地址转换为 String

  

InetAddress

 boolean equals(Object obj)  将此对象与指定对象比较。
 byte[] getAddress()  返回此 InetAddress 对象的原始 IP 地址。
static InetAddress[] getAllByName(String host)  在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr)  在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host, byte[] addr)  根据提供的主机名和 IP 地址创建 InetAddress。
static InetAddress getByName(String host)  在给定主机名的情况下确定主机的 IP 地址。
 String getCanonicalHostName() 获取此 IP 地址的完全限定域名。
 String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
 String getHostName() 获取此 IP 地址的主机名。
static InetAddress getLocalHost() 返回本地主机。
 int hashCode() 返回此 IP 地址的哈希码。
 boolean isAnyLocalAddress() 检查 InetAddress 是否是通配符地址的实用例行程序。
 boolean isLinkLocalAddress() 检查 InetAddress 是否是链接本地地址的实用例行程序。
 boolean isLoopbackAddress() 检查 InetAddress 是否是回送地址的实用例行程序。
 boolean isMCGlobal() 检查多播地址是否具有全局域的实用例行程序。
 boolean isMCLinkLocal() 检查多播地址是否具有链接范围的实用例行程序。
 boolean isMCNodeLocal() 检查多播地址是否具有节点范围的实用例行程序。
 boolean isMCOrgLocal() 检查多播地址是否具有组织范围的实用例行程序。
 boolean isMCSiteLocal()  检查多播地址是否具有站点范围的实用例行程序。
 boolean isMulticastAddress() 检查 InetAddress 是否是 IP 多播地址的实用例行程序。
 boolean isReachable(int timeout)  测试是否可以达到该地址。
 boolean isReachable(NetworkInterface netif, int ttl, int timeout) 测试是否可以达到该地址。  用某个if测试是否可通
 boolean isSiteLocalAddress() 检查 InetAddress 是否是站点本地地址的实用例行程序。
 String toString()  将此 IP 地址转换为 String

  此类没有构造方法,只能通过几个静态方法来生成对象实例。

  1、getAddress取原始byte[]数组ip地址

  2、isReachable相当于ping

 

  其子类Inet4Address  

boolean equals(Object obj) 将此对象与指定对象比较。
 byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址。
 String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
 int hashCode() 返回此 IP 地址的哈希码。
 boolean isAnyLocalAddress() 检查 InetAddress 是否是通配符地址的实用例行程序。
 boolean isLinkLocalAddress()  检查 InetAddress 是否是链接本地地址的实用例行程序。
 boolean isLoopbackAddress()  检查 InetAddress 是否是回送地址的实用例行程序。
 boolean isMCGlobal()  检查多播地址是否具有全局范围的实用例行程序。
 boolean isMCLinkLocal() 检查多播地址是否具有链接范围的实用例行程序。
 boolean isMCNodeLocal()  检查多播地址是否具有节点范围的实用例行程序。
 boolean isMCOrgLocal() 检查多播地址是否具有组织范围的实用例程。
 boolean isMCSiteLocal()  检查多播地址是否具有站点范围的实用例行程序。
 boolean isMulticastAddress()  检查 InetAddress 是否是 IP 多播地址的实用例行程序。
 boolean isSiteLocalAddress()  检查 InetAddress 是否是站点本地地址的实用例行程序。
posted @ 2015-08-08 09:17  光闪  阅读(6771)  评论(0编辑  收藏  举报