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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Java网络编程从入门到精通(10):Inet4Address类和Inet6Address类    从JDK1.4开始,Java提供了一个NetworkInterface类。

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(10):Inet4Address类和Inet6Address类

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

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

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

1. getByName方法

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

     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将返回nullgetByInetAddress方法的定义如下:

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.22ADSL连接临时分配给本机的IP地址,因此,运行结果返回的ppp0ADSL网络接口。

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

    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对象时使用的网络接口名,如eth0ppp0等。getName方法的定义如下:

public  String getName()

2. getDisplayName方法

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

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

下一篇: Java网络编程从入门到精通(12):使用isReachable方法探测主机是否可以连通

国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
17小时前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
11 3
|
1天前
|
Java
Java一分钟之-抽象类与接口的应用场景
【5月更文挑战第9天】Java中,抽象类和接口用于实现多态和抽象。抽象类不能实例化,提供部分实现和定义模板;接口包含无实现的抽象方法,用于定义行为规范和解耦合。选择时,关注行为用接口,部分实现用抽象类。注意抽象类的`final`和`static`方法、接口冲突等问题,明确设计目标,适度抽象,遵循接口设计原则,以提高代码质量。
9 1
|
1天前
|
Java
Java一分钟之-多态性:理解重写与接口
【5月更文挑战第9天】本文介绍了Java中的多态性,主要通过方法重写和接口实现。重写允许子类根据实际类型执行不同实现,关键点包括方法签名相同、访问权限不降低以及final、static和abstract方法不可重写。接口是抽象类型,包含抽象方法,提供另一种多态性实现。常见问题包括混淆重载与重写、不理解动态绑定以及滥用接口。为避免问题,需明确重写目的、合理设计接口,并在使用多态时注意类型检查。多态性是提升代码质量和灵活性的关键。
8 1
|
1天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
7 0
|
1天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
9 0
|
1天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
8 0
|
1天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
5 0
|
1天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
8 0
|
2天前
|
Java
Java一分钟之-类与对象:面向对象编程入门
【5月更文挑战第8天】本文为Java面向对象编程的入门指南,介绍了类与对象的基础概念、常见问题及规避策略。文章通过代码示例展示了如何定义类,包括访问修饰符的适当使用、构造器的设计以及方法的封装。同时,讨论了对象创建与使用时可能遇到的内存泄漏、空指针异常和数据不一致等问题,并提供了相应的解决建议。学习OOP需注重理论与实践相结合,不断编写和优化代码。
25 1
|
13天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。