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