`
liufei.fir
  • 浏览: 687523 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java网络编程(11):使用NetworkInterface类获得网络接口信

阅读更多
从JDK1.4开始,Java提供了一个NetworkInterface类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息。

一、创建NetworkInterface对象的两个静态方法

NetworkInerface类和InetAddress一样,也没有public的构造方法。因此,必须通过它的两个静态方法来创建NetworkInterface对象。可以使用两种方法来创建NetworkInterface对象:网络接口名(getByName方法)和IP地址(getByInetAddress方法)。

1. getByName方法

这个方法可以通过网络接口名来创建NetworkInterface对象。这个网络接口名并不是计算机名,而是用于标识物理或逻辑网络接口的名字,一般是由操作系统设置的。网络接口名在大多数操作系统上(包括Windows、Linux和Unix)是以eth开头,后面是网络接口的索引号,从0开始。如本机安了三块网卡,那么网络接口名就依次是eth0、eth1和eth2。NetworkInterface对象的toString方法可以返回网络接口的名称、显示名和这个网络接口上绑字的所有IP地址等信息。当网络接口名不存在时,getByName返回null。getByName方法定义如下:

    public static NetworkInterface getByName(String name) throws SocketException



下面的代码是一个显示指定网络接口信息的程序,网络接口名通过命令行参数传入。
package mynet;

import java.net.*;

public class MyNetworkInterface1
{
    public static void main(String[] args) throws Exception
    {
        if (args.length == 0)
            return;
        NetworkInterface ni = NetworkInterface.getByName(args[0]);
        System.out.println((ni == null) ? "网络接口不存在!" : ni);
    }
}



    * 测试1

执行如下命令:
java mynet.MyNetworkInterface1 eth0

运行结果:
name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC) index: 4 addresses:
/192.168.18.10;
/192.168.18.20;

    * 测试2

执行如下命令:
java mynet.MyNetworkInterface1 abcd

运行结果:
网络接口不存在!

2. getByInetAddress方法

    除了可以使用网络接口名来得到网络接口的信息,还可以利用getByInetAddress方法来确定一个IP地址属于哪一个网络接口。由于getByInetAddress方法必须使用一个InetAddress对象封装的IP地址来作为参数,因此,在使用getByInetAddress方法之前,必须先创建一个InetAddress对象。但要注意不能使用远程的IP的域名来创建InetAddress对象,否则getByInetAddress将返回null。getByInetAddress方法的定义如下:

public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException



    下面代码可以确定一个IP地址属于哪一个网络接口,这个IP地址通过命令行参数传入。

package mynet;

import java.net.*;

public class MyNetworkInterface2
{

    public static void main(String[] args) throws Exception
    {
        if(args.length == 0) return;
        InetAddress local = InetAddress.getByName(args[0]);
        NetworkInterface ni = NetworkInterface.getByInetAddress(local);
        System.out.println((ni == null) ? "本机不存在此IP地址!" : ni);       
    }
}



    * 测试1

执行如下命令:
java mynet.MyNetworkInterface2 127.0.0.1

运行结果:
name:lo (MS TCP Loopback interface) index: 1 addresses:
/127.0.0.1;
/0:0:0:0:0:0:0:1;

    * 测试2

执行如下命令:
java mynet.MyNetworkInterface2 218.61.151.22

运行结果:
name:ppp0 (WAN (PPP/SLIP) Interface) index: 0 addresses:
/218.61.151.22;

    测试2使用的IP地址218.61.151.22是ADSL连接临时分配给本机的IP地址,因此,运行结果返回的ppp0是ADSL网络接口。



二、得到本机所有的网络接口

    NetworkInterface可以通过getNetworkInterfaces方法来枚举本机所有的网络接口。我们也可以利用getNetworkInterfaces得到的网络接口来枚举本机的所有IP地址。当然,也可以通过InetAddress类的getAllByName来得到本机的所有IP地址。但getNetworkInterfaces方法可以按网络接口将这些IP地址进行分组,这对于只想得到某个网络接口上的所有IP地址是非常有用的。getNetworkInterfaces方法的定义如下:
public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException



    下面代码演示了如何使用getNetworkInterfaces方法得到本机所有的网络接口。
package mynet;

import java.net.*;
import java.util.*;

public class MyNetworkInterface3
{
    public static void main(String[] args) throws Exception
    {
        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
        while (nis.hasMoreElements())
            System.out.println(nis.nextElement());
    }
}



运行结果(部分):
name:lo (MS TCP Loopback interface) index: 1 addresses:
/127.0.0.1;
/0:0:0:0:0:0:0:1;
name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC ) index: 4 addresses:
/192.168.18.10;
/192.168.18.20;
name:ppp0 (WAN (PPP/SLIP) Interface) index: 0 addresses:
/218.61.151.22;


    上面的运行结果只是一种可能的结果,读者在运行上面的程序时根据本机的硬件和软件的配置不同,运行结果可能会有所不同。

三、NetworkInterface类的Getter方法

    NetworkInterface类提供了三个方法可以分别得到网络接口名(getName方法)、网络接口别名(getDisplayName方法)以及和网络接口绑定的所有IP地址(getInetAddresses方法)。

1. getName方法

这个方法用来得到一个网络接口的名称。这个名称就是使用getByName方法创建NetworkInterface对象时使用的网络接口名,如eth0、ppp0等。getName方法的定义如下:
public String getName()



2. getDisplayName方法

这个方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如Unix),getDisplayName方法和getName方法的返回值相同,但在Windows中getDisplayName方法一般会返回一个更为友好的名字,如Realtek RTL8139 Family PCI Fast Ethernet NIC。getDisplayName方法的定义如下:
public String getDisplayName()



3. getInetAddresses方法

NetworkInterface类可以通过getInetAddresse方法以InetAddress对象的形式返回和网络接口绑定的所有IP地址。getInetAddresses方法的定义如下:
public Enumeration<InetAddress> getInetAddresses()



上面的代码演示了如果使用上述三个Getter方法。
package mynet;

import java.net.*;
import java.util.*;

public class MyNetworkInterface4
{
    public static void main(String[] args) throws Exception
    {
        if (args.length == 0)
            return;
        NetworkInterface ni = NetworkInterface.getByName(args[0]);
        System.out.println("Name: " + ni.getName());
        System.out.println("DisplayName: " + ni.getDisplayName());
        Enumeration<InetAddress> addresses = ni.getInetAddresses();
        while (addresses.hasMoreElements())
            System.out.println(addresses.nextElement().getHostAddress());
    }
}



1. 测试

执行如下命令:
java mynet.MyNetworkInterface4 eth0

运行结果:
Name: eth0
DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC
192.168.18.10
192.168.18.20


NetworkInterface.getHardwareAddress 这个方法就是获得机器的MAC地址的。

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Formatter;
import java.util.Locale;

/**
* 使用JAVA代码获得系统的MAC地址和IP地址。
*
* @author 享受JAVA(enjoyjava.net)
*/
public class TestIpMac {
  public static void main(String[] args) throws Exception {
    InetAddress address = InetAddress.getLocalHost(); // 获得当前主机地址
    NetworkInterface ni = NetworkInterface.getByInetAddress(address); // 获得网络接口
    byte[] mac = ni.getHardwareAddress(); // 获得硬件的MAC地址
    String sIP = address.getHostAddress(); // 获得IP地址
    String sMAC = "";
    Formatter formatter = new Formatter();
    for (int i = 0; i < mac.length; i++) { // 组合成MAC的字符串
      sMAC = formatter.format(Locale.getDefault(), "%02X%s", mac[i], (i < mac.length - 1) ? "-" : "").toString();
    }
    System.out.println("IP:" + sIP);
    System.out.println("MAC:" + sMAC);
  }
}


分享到:
评论

相关推荐

    Java网络编程实例(随书源代码)

    - **DNS解析**:Java的NetworkInterface类和InetAddress类可用于查询网络接口信息和执行DNS查询。 这些源代码实例将覆盖上述各个主题,通过实际操作加深对Java网络编程的理解。在学习过程中,读者可以调试、修改...

    Java网络编程.pdf

    - **网络接口信息**:`NetworkInterface`类提供了一个接口,用于获取系统的网络接口信息,包括名称、硬件地址、子网掩码等。 - **主机可达性**:`isReachable()`方法用于测试两台主机之间是否可以通信,通常用于简单...

    Java网络编程 3rd

    - **NetworkInterface类**:探讨了如何使用NetworkInterface类来获取网络接口信息。 ##### 2.5 URL与URI操作 - **URL类详解**:深入讲解了URL类的构造方法和常用API,例如如何构建URL对象、解析URL组件等。 - **...

    Java网络高级编程

    在Java编程领域,网络编程是不可或缺的一部分,尤其是在构建分布式系统、服务器端应用或者网络通信工具时。本资源“Java网络高级编程”是一个401页的详细教程,旨在帮助开发者深入理解和掌握Java在网络编程中的高级...

    Java网络编程(第三版)中文版.part09.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)高清中文版.part01.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)中文版.part07.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程获取主机信息

    另外,获取MAC地址通常需要使用`java.net.NetworkInterface`类,通过遍历所有网络接口并调用`getHardwareAddress()`来获取物理地址。 接着,关于操作系统信息,Java提供了`java.lang.management`包,其中的`...

    Java网络编程(第三版)中文版.part11.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    java实现无线网络断网自动重连(完整eclipse项目)

    这个项目可能使用了`java.net.NetworkInterface`类来获取网络接口信息,检查无线网络的状态。`InetAddress`类则用来获取和处理IP地址,判断网络是否可达。同时,可能使用了定时任务,如`java.util.Timer`和`java....

    Java Socket网络编程

    此外,如果需要获取所有网络接口的IP地址,可以枚举`NetworkInterface`,遍历其`InetAddress`,这在处理多网络接口的设备时很有用。 Java Socket编程还涉及许多其他关键概念,例如异常处理、线程同步、数据编码解码...

    JAVA网络编程从入门到精通

    `NetworkInterface`类提供了获取系统网络接口的信息,例如名称、硬件地址等。 - **`NetworkInterface.getByName(String name)`**:通过网络接口名称获取`NetworkInterface`对象。 - **`NetworkInterface....

    Java网络编程(第三版)中文版.part06.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    java动态修改IP程序

    3. **网络接口(Network Interface)**:在Java中,`java.net.NetworkInterface`类提供了与网络接口相关的操作,包括获取所有网络接口、查找特定接口、获取接口的IP地址等。虽然不能直接修改IP,但这个类可以帮助...

    Java网络编程(第三版)中文版.part01.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)中文版.part03.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)中文版.part02.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)中文版.part04.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)中文版.part10.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

    Java网络编程(第三版)中文版.part13.rar

    NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing...

Global site tag (gtag.js) - Google Analytics