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

时间: 2024-10-31 03:21:22

Java网络编程从入门到精通(11):使用NetworkInterface类获得网络接口信息的相关文章

Java网络编程从入门到精通(4):DNS缓存

在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作.在Java中为了缓解这个问题,提供了DNS缓存.当InetAddress类第一次使用某个域名(如www.csdn.net)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中.当下一次InetAddress类再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器. DNS缓存在默认时将永

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.         连接服务器 2.         发送

Java网络编程从入门到精通(18):Socket类的getter和setter方法(2)

二.用于获得和设置Socket选项的getter和setter方法 Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: public final static int TCP_NODELAY = 0x0001;    public final static int SO_REUSEADDR = 0x04;    public final static int

Java网络编程从入门到精通 (9):使用isXxx方法判断地址类型

IP地址分为普通地址和特殊地址.在前面的文章中所使用的大多数都是普通的IP地址,在本文中将介绍如何利用InetAddress类提供的十个方法来确定一个IP地址是否是一个特殊的IP地址. 一.isAnyLocalAddress方法 当IP地址是通配符地址时返回true,否则返回false.这个通配符地址对于拥有多个网络接口(如两块网卡)的计算机非常拥有.使用通配符地址可以允许在服务器主机接受来自任何网络接口的客户端连接.IPv4的通配符地址是0.0.0.0.IPv6的通配符地址是0:0:0:0:0

Java网络编程从入门到精通(16):客户端套接字(Socket)的超时

客户端套接字的超时(timeout)就是指在客户端通过Socket和服务器进行通讯的过程中,由于网络延迟,网络阻塞等原因,造成服务器并未及时响应客户端的一种现象.在一段时间后,客户端由于未收到服务端的响应而抛出一个超时错误; 其中客户端所等待的时间就是超时时间. 由于生产超时错误的一端都是被动端:也就是说,这一端是在接收数据,而不是发送数据.对于客户端Socket来说,只有两个地方是在接收数据:一个是在连接服务器时;另一个是在连接服务器成功后,接收服务器发过来的数据时.因此,客户端超时也分为两种

Java网络编程从入门到精通(14):多种多样的建立网络连接的方式

在上一篇文章中我们讨论了Socket类的基本用法,并给出的例子中使用Socket类连接服务器时使用了一种最简单的连接方式,也就是通过IP和端口号来连接服务器.而为了使连接服务器的方式更灵活,Socket类不仅可以通过自身的构造方法连接服务器,而且也可以通过connect方法来连接数据库. 一.通过构造方法连接服务器 我们可以通过6个重载构造函数以不同的方式来连接服务器.这6个重载的构造函数可以分为两类: 1. 自动选择IP     这种方式是最常用的.所谓自动选择IP,是指当本机有多块网卡或者在

Java网络编程从入门到精通(8):用getAddress方法获得IP地址

getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.getAddress方法的定义如下: public byte[] getAddress() 这个方法返回的byte数组是有符号的.在Java中byte类型的取值范围是-128?127.如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数.由于Java中没有无符号byte类型,因此

Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址

 这个方法用来得到主机的IP地址,这个IP地址可能是IPv4的地址,也可能是IPv6的地址.getHostAddress方法的定义如下: public String getHostAddress() 无论InetAddress对象是使用哪种方式创建的,getHostAddress方法都不会访问DNS服务器.如果想访问使用IPv6地址的远程主机,需要在操作系统上安装IPv6协议.下面是Windows 2003上安装IPv6协议的步骤: 第一步:打开“本地连接”属性对话框.如图1所示. 图1 “本地

Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名

该方法可以得到远程主机的域名,也可以得到本机名.getHostName方法的定义如下: public String getHostName() 下面是三种创建InetAddress对象的方式,在这三种方式中,getHostName返回的值是不同的. 1.使用getLocalHost方法创建InetAddress对象 如果InetAddress对象是用getLocalHost方法创建的,getHostName返回的是本机名.如下面的代码所示: InetAddress address = InetA