摘要:問題提出在使用開發網絡程序時,有時候我們需要知道本機在局域網中的地址。在平臺上同樣可以使用來實現獲得機器在局域網內地址的功能。
1、問題提出
在使用 Java 開發網絡程序時,有時候我們需要知道本機在局域網中的 IP 地址。很常見的一種做法是調用本地命令(比如 Windows 上的 ipconfig 命令和 Linux 上的 ifconfig 命令),接著解析本地命令的輸出,最后得到本機在局域網內的 IP 地址。很明顯,這種做法不夠方便,也不夠 Java。于是引出了 Java 在 JDK1.4 的時候添加的一個類: NetworkInterface 。
2、尋找方法顧名思義,NetworkInterface 用于表示一個網絡接口,這可以是一個物理的網絡接口,也可以是一個虛擬的網絡接口,而一個網絡接口通常由一個 IP 地址來表示。既然 NetworkInterface 用來表示一個網絡接口,那么如果可以獲得當前機器所有的網絡接口(包括物理的和虛擬的),然后篩選出表示局域網的那個網絡接口,那就可以得到機器在局域網內的 IP 地址。
查看 NetworkInterface 類的所有方法,發現如下兩個方法:
public static EnumerationgetNetworkInterfaces()
通過 API 文檔可知,使用 getNetworkInterfaces 方法即可得到當前機器上所有的網絡接口。
public EnumerationgetInetAddresses()
通過 API 文檔可知,getInetAddresses 方法返回綁定到該網卡的所有的 IP 地址。(雖然一個網絡接口確實可以綁定多個 IP 地址,然而通常情況下,一個網絡接口都是只對應一個 IP 地址)
3、實踐OK,現在讓電腦連接上 WiFi,來實踐下 NetworkInterface 的功能。
import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; public class NetworkInterfaceTest { public static void main(String[] args) throws Exception { // 獲得本機的所有網絡接口 Enumerationnifs = NetworkInterface.getNetworkInterfaces(); while (nifs.hasMoreElements()) { NetworkInterface nif = nifs.nextElement(); // 獲得與該網絡接口綁定的 IP 地址,一般只有一個 Enumeration addresses = nif.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); if (addr instanceof Inet4Address) { // 只關心 IPv4 地址 System.out.println("網卡接口名稱:" + nif.getName()); System.out.println("網卡接口地址:" + addr.getHostAddress()); System.out.println(); } } } } }
在我機器(Windows10)上運行結果:
對比使用 ipconfig 命令得到的結果:
可以發現
網卡接口名稱:wlan1 網卡接口地址:192.168.3.5
即為機器在局域網內的 IP 地址 —— Windows 平臺上局域網的網絡接口以“wlan”開頭。(lo 為本地回環地址,eth0 和 eth4 為 VMware 創建的虛擬地址)
于是我們可以寫出一個簡單的在 Windows 機器上獲得局域網 IP 地址的方法:
public InetAddress getLANAddressOnWindows() { try { Enumerationnifs = NetworkInterface.getNetworkInterfaces(); while (nifs.hasMoreElements()) { NetworkInterface nif = nifs.nextElement(); if (nif.getName().startsWith("wlan")) { Enumeration addresses = nif.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); if (addr.getAddress().length == 4) { // 速度快于 instanceof return addr; } } } } } catch (SocketException ex) { ex.printStackTrace(System.err); } return null; }
(該方法沒有考慮 Windows 平臺上有多個網絡接口的名稱以 “wlan” 開頭的情況,比如你的機器連接了 WiFi,然后又使用該機器作為熱點 —— 不過很容易對二者進行區分,請有興趣的讀者自己實踐)
在 JDK1.6 時 NetworkInterface 還添加了一個新的方法:
public ListgetInterfaceAddresses()
getInterfaceAddresses 方法的作用與 getInetAddresses 方法類似,但是返回的是一個綁定到該網絡接口的所有 InterfaceAddress 的集合。InterfaceAddress 也是 JDK1.6 之后添加的類,相比于 InetAddress 的區別在于它除了具有一個 IP 地址(InetAddress),還包括了該地址對應的廣播地址和掩碼長度。
4、總結當然,使用 NetworkInterface 類來獲取機器在局域網內的 IP 地址還是有一定的平臺相關性,但是相比于使用本地命令的方式來說,會更加方便和更加的 Java 。
PS:在 Android 平臺上同樣可以使用 NetworkInterface 來實現獲得機器在局域網內 IP 地址的功能。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69782.html
摘要:前言今天,我將梳理在網絡編程中很重要的一個類以及其相關的類。這類主機通常不需要外部互聯網服務,僅有主機間相互通訊的需求。可以通過該接口獲取所有本地地址,并根據這些地址創建。在這里我們使用阻塞隊列實現主線程和打印線程之間的通信。 前言 今天,我將梳理在Java網絡編程中很重要的一個類InetAddress以及其相關的類NetworkInterface。在這篇文章中將會涉及: InetA...
摘要:那沒有建立連接的情況下,發現房間這個功能是怎么實現的呢首先,既然手機處于局域網中,那么根據手機當前在局域網的地址和子網掩碼,就可以獲得這個局域網內所有機器的地址的范圍。 記得以前我們使用類似快牙這些文件分享工具的時候,一開始就是先在 手機A 上創建一個房間,然后連接上 手機A WiFi 熱點的其他手機(即這些手機處于一個局域網內)就可以發現到這個房間并加入到這個房間里面,然后就可以互相...
摘要:原文鏈接獲取本地的工具獲取本地地址,有可能會有多個地址若有多個網卡則會搜集多個網卡的地址 原文鏈接:https://gist.github.com/pfmiles/9f7273b12b4b486e2e9c package test; import java.net.InetAddress; import java.net.NetworkInterface; import java....
摘要:三端口與套接字端口指一臺計算機只有單一的連接到網絡的物理連接,所以的數據都通過此連接對內對外送達特定的計算機,這就是端口。三程序設計由上面可知基于的信息傳遞速度更快。接收數據包使用創建數據包套接字,綁定指定端口。 服務器 網絡 客戶機 第一部分 一.局域網與因特網 服務器是指提供信息的計算機或程序,...
摘要:用于標識所在多播組的本地接口。其中都是網絡接口的唯一標識符號。運行程序,通過抓包后顯示發送成功,并抓到了返回數據黑色標記行為發送數據,橙色標記行為接收數據。 上次寫了一篇 Android Ping IPv6 地址的教程,這個工作的目的就是想通過 Volte 網絡發送 SIP 消息。但是 Android 默認的網絡環境是 Wifi、2G/3G/4G, 不會默認通過 Volte 網絡發送數...
閱讀 2141·2023-04-26 03:06
閱讀 3589·2023-04-26 01:51
閱讀 2090·2021-11-24 09:38
閱讀 2464·2021-11-17 17:00
閱讀 2332·2021-09-28 09:36
閱讀 947·2021-09-24 09:47
閱讀 2590·2019-08-30 15:54
閱讀 1559·2019-08-30 15:44