熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息

2013-11-23 19:36:48  來源: Java核心技術 

  從JDK開始Java提供了一個NetworkInterface類這個類可以得到本機所有的物理網絡接口和虛擬機等軟件利用本機的物理網絡接口創建的邏輯網絡接口的信息

  相關技術專題Java網絡編程基礎到進階教程

  創建NetworkInterface對象的兩個靜態方法

  NetworkInerface類和InetAddress一樣也沒有public的構造方法因此必須通過它的兩個靜態方法來創建NetworkInterface對象可以使用兩種方法來創建NetworkInterface對象網絡接口名(getByName方法)和IP地址(getByInetAddress方法)

   getByName方法

  這個方法可以通過網絡接口名來創建NetworkInterface對象這個網絡接口名並不是計算機名而是用於標識物理或邏輯網絡接口的名字一般是由操作系統設置的網絡接口名在大多數操作系統上(包括WindowsLinux和Unix)是以eth開頭後面是網絡接口的索引號開始如本機安了三塊網卡那麼網絡接口名就依次是etheth和ethNetworkInterface對象的toString方法可以返回網絡接口的名稱顯示名和這個網絡接口上綁字的所有IP地址等信息當網絡接口名不存在時getByName返回nullgetByName方法定義如下

   public static NetworkInterface getByName(String name) throws SocketException

  下面的代碼是一個顯示指定網絡接口信息的程序網絡接口名通過命令行參數傳入

   package mynet;

import *;

public class MyNetworkInterface
{
    public static void main(String[] args) throws Exception
    {
        if (argslength == )
            return;
        NetworkInterface ni = NetworkInterfacegetByName(args[]);
        Systemoutprintln((ni == null) ? 網絡接口不存在! : ni);
    }
}

  測試

  執行如下命令

   java mynetMyNetworkInterface eth

  運行結果

   name:eth (Realtek RTL Family PCI Fast Ethernet NIC) index:  addresses:
/;
/;

  測試

  執行如下命令

   java mynetMyNetworkInterface abcd

  運行結果

   網絡接口不存在!

   getByInetAddress方法

  除了可以使用網絡接口名來得到網絡接口的信息還可以利用getByInetAddress方法來確定一個IP地址屬於哪一個網絡接口由於getByInetAddress方法必須使用一個InetAddress對象封裝的IP地址來作為參數因此在使用getByInetAddress方法之前必須先創建一個InetAddress對象但要注意不能使用遠程的IP的域名來創建InetAddress對象否則getByInetAddress將返回nullgetByInetAddress方法的定義如下

   public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException

  下面代碼可以確定一個IP地址屬於哪一個網絡接口這個IP地址通過命令行參數傳入

   package mynet;

import *;

public class MyNetworkInterface
{

    public static void main(String[] args) throws Exception
    {
        if(argslength == ) return;
        InetAddress local = InetAddressgetByName(args[]);
        NetworkInterface ni = NetworkInterfacegetByInetAddress(local);
        Systemoutprintln((ni == null) ? 本機不存在此IP地址! : ni);        
    }
}

  測試

  執行如下命令

   java mynetMyNetworkInterface 

  運行結果

   name:lo (MS TCP Loopback interface) index:  addresses:
/;
/:::::::;

  測試

  執行如下命令

   java mynetMyNetworkInterface 

  運行結果

   name:ppp (WAN (PPP/SLIP) Interface) index:  addresses:
/;

  測試使用的IP地址是ADSL連接臨時分配給本機的IP地址因此運行結果返回的ppp是ADSL網絡接口

  得到本機所有的網絡接口

  NetworkInterface可以通過getNetworkInterfaces方法來枚舉本機所有的網絡接口我們也可以利用getNetworkInterfaces得到的網絡接口來枚舉本機的所有IP地址當然也可以通過InetAddress類的getAllByName來得到本機的所有IP地址但getNetworkInterfaces方法可以按網絡接口將這些IP地址進行分組這對於只想得到某個網絡接口上的所有IP地址是非常有用的getNetworkInterfaces方法的定義如下

   public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException

  下面代碼演示了如何使用getNetworkInterfaces方法得到本機所有的網絡接口

   package mynet;

import *;
import javautil*;

public class MyNetworkInterface
{
    public static void main(String[] args) throws Exception
    {
        Enumeration<NetworkInterface> nis = NetworkInterfacegetNetworkInterfaces();
        while (nishasMoreElements())
            Systemoutprintln(nisnextElement());
    }
}

  運行結果(部分)

   name:lo (MS TCP Loopback interface) index:  addresses:
/;
/:::::::;
name:eth (Realtek RTL Family PCI Fast Ethernet NIC ) index:  addresses:
/;
/;
name:ppp (WAN (PPP/SLIP) Interface) index:  addresses:
/;

  上面的運行結果只是一種可能的結果讀者在運行上面的程序時根據本機的硬件和軟件的配置不同運行結果可能會有所不同

  NetworkInterface類的Getter方法

  NetworkInterface類提供了三個方法可以分別得到網絡接口名(getName方法)網絡接口別名(getDisplayName方法)以及和網絡接口綁定的所有IP地址(getInetAddresses方法)

   getName方法

  這個方法用來得到一個網絡接口的名稱這個名稱就是使用getByName方法創建NetworkInterface對象時使用的網絡接口名如ethpppgetName方法的定義如下

   public String getName()

   getDisplayName方法

  這個方法可以得到更容易理解的網絡接口名也可以將這個網絡接口名稱為網絡接口別名在一些操作系統中(如Unix)getDisplayName方法和getName方法的返回值相同但在Windows中getDisplayName方法一般會返回一個更為友好的名字如Realtek RTL Family PCI Fast Ethernet NICgetDisplayName方法的定義如下

   public String getDisplayName()

   getInetAddresses方法

  NetworkInterface類可以通過getInetAddresse方法以InetAddress對象的形式返回和網絡接口綁定的所有IP地址getInetAddresses方法的定義如下

   public Enumeration<InetAddress> getInetAddresses()

  上面的代碼演示了如果使用上述三個Getter方法

   package mynet;

import *;
import javautil*;

public class MyNetworkInterface
{
    public static void main(String[] args) throws Exception
    {
        if (argslength == )
            return;
        NetworkInterface ni = NetworkInterfacegetByName(args[]);
        Systemoutprintln(Name:  + nigetName());
        Systemoutprintln(DisplayName:  + nigetDisplayName());
        Enumeration<InetAddress> addresses = nigetInetAddresses();
        while (addresseshasMoreElements())
            Systemoutprintln(addressesnextElement()getHostAddress());
    }
}

  測試

  執行如下命令

   java mynetMyNetworkInterface eth

  運行結果

   Name: eth
DisplayName: Realtek RTL Family PCI Fast Ethernet NIC


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27178.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.