成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 網(wǎng)絡(luò)編程(1):使用 NetworkInterface 獲得本機(jī)在局域網(wǎng)內(nèi)的 IP 地址

Carl / 3187人閱讀

摘要:?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 Enumeration getNetworkInterfaces()

通過(guò) API 文檔可知,使用 getNetworkInterfaces 方法即可得到當(dāng)前機(jī)器上所有的網(wǎng)絡(luò)接口。

public Enumeration getInetAddresses()

通過(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ò)接口
        Enumeration nifs = 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 {
        Enumeration nifs = 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 List getInterfaceAddresses()

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

相關(guān)文章

  • 重拾Java Network Programming(二)InetAddress

    摘要:前言今天,我將梳理在網(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...

    daryl 評(píng)論0 收藏0
  • Java網(wǎng)絡(luò)編程(3):使用 UDP 探測(cè)域網(wǎng)內(nèi)特定類型的機(jī)器

    摘要:那沒(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è)房間里面,然后就可以互相...

    focusj 評(píng)論0 收藏0
  • 分享代碼片段:java中準(zhǔn)確地獲取本機(jī)ip地址(列表)的方法

    摘要:原文鏈接獲取本地的工具獲取本地地址,有可能會(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....

    wujl596 評(píng)論0 收藏0
  • JAVA網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)(筆記)

    摘要:三端口與套接字端口指一臺(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ī)或程序,...

    PAMPANG 評(píng)論0 收藏0
  • Android 指定網(wǎng)絡(luò)接口收發(fā) Socket 數(shù)據(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ù)...

    wangbinke 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Carl

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<