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 是否是站點本地地址的實用例行程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM