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

mac2022-06-30  31

  一个网卡(不太标准,应该叫做一个网络接口,一个网卡是可以拥有多个网络接口的,如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

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

static Enumeration<NetworkInterface>

getNetworkInterfaces() 返回此机器上的所有接口。 NetworkInterfacegetParent() 如果此接口是子接口,则返回它的父 NetworkInterface;如果它是物理(非虚拟)接口或没有父接口,则返回 null。Enumeration<NetworkInterface>getSubInterfaces() 获取具有连接到此网络接口的所有子接口(也称虚拟接口)的 Enumeration。 inthashCode() 返回该对象的哈希码值。 booleanisLoopback() 返回网络接口是否是回送接口。 booleanisPointToPoint() 返回网络接口是否是点对点接口。 booleanisUp() 返回网络接口是否已经开启并运行。 booleanisVirtual()  返回此接口是否是虚拟接口(也称为子接口)。 booleansupportsMulticast()  返回网络接口是否支持多址广播。 StringtoString() 返回该对象的字符串表示。

  需要特别关注的是:

  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

 booleanequals(Object obj)  将此对象与指定对象比较。 InetAddressgetAddress() 返回此地址的 InetAddress。 InetAddressgetBroadcast() 返回此 InterfaceAddress 广播地址的 InetAddress。 shortgetNetworkPrefixLength() 返回此地址的网络前缀长度。用来取子网掩码 inthashCode() 返回此接口地址的哈希码。 StringtoString()  将此接口地址转换为 String。

  

InetAddress

 booleanequals(Object obj)  将此对象与指定对象比较。 byte[]getAddress()  返回此 InetAddress 对象的原始 IP 地址。static InetAddress[]getAllByName(String host)  在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。static InetAddressgetByAddress(byte[] addr)  在给定原始 IP 地址的情况下,返回 InetAddress 对象。static InetAddressgetByAddress(String host, byte[] addr)  根据提供的主机名和 IP 地址创建 InetAddress。static InetAddressgetByName(String host)  在给定主机名的情况下确定主机的 IP 地址。 StringgetCanonicalHostName() 获取此 IP 地址的完全限定域名。 StringgetHostAddress() 返回 IP 地址字符串(以文本表现形式)。 StringgetHostName() 获取此 IP 地址的主机名。static InetAddressgetLocalHost() 返回本地主机。 inthashCode() 返回此 IP 地址的哈希码。 booleanisAnyLocalAddress() 检查 InetAddress 是否是通配符地址的实用例行程序。 booleanisLinkLocalAddress() 检查 InetAddress 是否是链接本地地址的实用例行程序。 booleanisLoopbackAddress() 检查 InetAddress 是否是回送地址的实用例行程序。 booleanisMCGlobal() 检查多播地址是否具有全局域的实用例行程序。 booleanisMCLinkLocal() 检查多播地址是否具有链接范围的实用例行程序。 booleanisMCNodeLocal() 检查多播地址是否具有节点范围的实用例行程序。 booleanisMCOrgLocal() 检查多播地址是否具有组织范围的实用例行程序。 booleanisMCSiteLocal()  检查多播地址是否具有站点范围的实用例行程序。 booleanisMulticastAddress() 检查 InetAddress 是否是 IP 多播地址的实用例行程序。 booleanisReachable(int timeout)  测试是否可以达到该地址。 booleanisReachable(NetworkInterface netif, int ttl, int timeout) 测试是否可以达到该地址。  用某个if测试是否可通 booleanisSiteLocalAddress() 检查 InetAddress 是否是站点本地地址的实用例行程序。 StringtoString()  将此 IP 地址转换为 String。

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

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

  2、isReachable相当于ping

 

  其子类Inet4Address  

booleanequals(Object obj) 将此对象与指定对象比较。 byte[]getAddress() 返回此 InetAddress 对象的原始 IP 地址。 StringgetHostAddress() 返回 IP 地址字符串(以文本表现形式)。 inthashCode() 返回此 IP 地址的哈希码。 booleanisAnyLocalAddress() 检查 InetAddress 是否是通配符地址的实用例行程序。 booleanisLinkLocalAddress()  检查 InetAddress 是否是链接本地地址的实用例行程序。 booleanisLoopbackAddress()  检查 InetAddress 是否是回送地址的实用例行程序。 booleanisMCGlobal()  检查多播地址是否具有全局范围的实用例行程序。 booleanisMCLinkLocal() 检查多播地址是否具有链接范围的实用例行程序。 booleanisMCNodeLocal()  检查多播地址是否具有节点范围的实用例行程序。 booleanisMCOrgLocal() 检查多播地址是否具有组织范围的实用例程。 booleanisMCSiteLocal()  检查多播地址是否具有站点范围的实用例行程序。 booleanisMulticastAddress()  检查 InetAddress 是否是 IP 多播地址的实用例行程序。 booleanisSiteLocalAddress()  检查 InetAddress 是否是站点本地地址的实用例行程序。

转载于:https://www.cnblogs.com/guangshan/p/4712550.html

最新回复(0)