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开发速学宝典》出版,欢迎定购

目录
相关文章
|
1天前
|
Java 编译器 测试技术
|
11天前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
11天前
|
Java 程序员 UED
Java 中的异常处理:从入门到精通
【8月更文挑战第31天】在Java编程的世界中,异常处理是保持应用稳定性的重要机制。本文将引导你理解异常的本质,学会如何使用try-catch语句来捕获和处理异常,并探索自定义异常类的魅力。我们将一起深入异常的世界,让你的代码更加健壮和用户友好。
|
11天前
|
Java 数据库连接 开发者
Java中的异常处理:从入门到精通
【8月更文挑战第31天】 在编程世界中,错误和异常就像是不请自来的客人,总是在不经意间打扰我们的程序运行。Java语言通过其异常处理机制,为开发者提供了一套优雅的“待客之道”。本文将带你走进Java异常处理的世界,从基础语法到高级技巧,再到最佳实践,让你的程序在面对意外时,也能从容不迫,优雅应对。
|
11天前
|
Java 开发者
Java 中的异常处理:从入门到精通
【8月更文挑战第31天】在Java的世界中,异常处理是保持程序健壮性的基石。本文将带你探索Java异常处理的奥秘,从基本的try-catch语句到深入理解自定义异常和最佳实践。你将学会如何优雅地处理错误,确保你的代码不仅能够面对意外情况,还能从中恢复。让我们一起开启这段旅程,掌握让程序更加稳定和可靠的技巧吧!
|
2月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
115 1
|
2月前
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
4月前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
46 1
|
JSON 前端开发 安全
Java网络编程IO模型 --- BIO、NIO、AIO详解
Java网络编程IO模型 --- BIO、NIO、AIO详解
335 0
Java网络编程IO模型 --- BIO、NIO、AIO详解
|
JSON 安全 JavaScript
Java网络编程IO模型 --- BIO、NIO、AIO详解
一文教你搞懂Java网络编程 BIO、NIO、AIO
396 0
Java网络编程IO模型 --- BIO、NIO、AIO详解