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




本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214458,如需转载请自行联系原作者

相关文章
|
11月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
429 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
396 1
|
10月前
|
机器学习/深度学习 移动开发 编解码
基于人工神经网络的类噪声环境声音声学识别(Matlab代码实现)
基于人工神经网络的类噪声环境声音声学识别(Matlab代码实现)
250 1
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
797 62
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
机器学习/深度学习 自然语言处理 计算机视觉
RT-DETR改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
RT-DETR改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
819 13
RT-DETR改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
685 23
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解