InterfaceAddress类的使用、NetworkInterface类静态方法

InterfaeAddress类的使用

public java.util.List<InterfaceAddress> getInterfaceAddresses()

获取网络接口的InterfaceAddresses列表。通过使用InterfaceAddresses 类中的方法可以取得网络接口对应的IP地址、子网掩码和广播地址等相关信息。

  • 对于IPv4地址,可以取得IP地址、子网掩码和广播地址,
  • 对于IPv6地址,可以取得IP地址和网络前缀长度这样的信息。

什么是网络前缀长度?网络前缀长度在IPv4地址上下文中也称为子网掩码。典型的IPv4值是8 (255.0.0.0)、16 (255.255.0.0)或24 (255.255.255.0);典型的IPv6值是128(::1/128 )或10 (fe80::203:baff:fe27:1243/10 )

InetAddress类是对应IP地址信息的,而InterfaceAddress类是对应网络接口信息的,可以在InterfaceAddress对象中取得IP地址的InetAddress对象信息,以及多播地址的InetAddress 对象信息,还有子网掩码等。

public InetAddress getAddress()
返回此InterfaceAddress的InetAddress

public InetAddress getBroadcasst()
返回此InterfaceAddress广播地址的InetAddress。由于只有IPv4网络具有广播地址,因此对于IPv6网络将返回null

public short getNetworkPrefixLength()
返回此InterfaceAddress的网络前缀长度

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface next = networkInterfaces.nextElement();
            System.out.println("getName获得网络设备名称=" + next.getName());
            System.out.println("getDisplayName获得网络设备显示名称=" + next.getDisplayName());
            List<InterfaceAddress> interfaceAddresses = next.getInterfaceAddresses();
            for (int i = 0; i < interfaceAddresses.size(); i++) {
                InterfaceAddress each = interfaceAddresses.get(i);
                InetAddress inetAddress = each.getAddress();
                if (inetAddress != null) {
                    System.out.println("\tinetAddress.getAddress()=" + inetAddress.getHostAddress());
                }
                InetAddress broadcast = each.getBroadcast();
                if (broadcast != null) {
                    System.out.println("\tbroadcast.getBroadcast()=" + broadcast.getHostAddress());
                }
                System.out.println("\tgetNetworkPrefixLength=" + each.getNetworkPrefixLength());
            }
            System.out.println();
        }
getName获得网络设备名称=utun1
getDisplayName获得网络设备显示名称=utun1
	inetAddress.getAddress()=fe80:0:0:0:d1c:16db:f38d:b4ef%utun1
	getNetworkPrefixLength=64

getName获得网络设备名称=utun0
getDisplayName获得网络设备显示名称=utun0
	inetAddress.getAddress()=fe80:0:0:0:c7ad:7959:ee19:2743%utun0
	getNetworkPrefixLength=64

getName获得网络设备名称=llw0
getDisplayName获得网络设备显示名称=llw0
	inetAddress.getAddress()=fe80:0:0:0:309c:17ff:fe12:69f3%llw0
	getNetworkPrefixLength=64

getName获得网络设备名称=awdl0
getDisplayName获得网络设备显示名称=awdl0
	inetAddress.getAddress()=fe80:0:0:0:309c:17ff:fe12:69f3%awdl0
	getNetworkPrefixLength=64

getName获得网络设备名称=en5
getDisplayName获得网络设备显示名称=en5
	inetAddress.getAddress()=fe80:0:0:0:aede:48ff:fe00:1122%en5
	getNetworkPrefixLength=64

getName获得网络设备名称=en0
getDisplayName获得网络设备显示名称=en0
	inetAddress.getAddress()=fe80:0:0:0:83f:7f1d:b90d:e421%en0
	getNetworkPrefixLength=64
	inetAddress.getAddress()=192.168.0.100
	broadcast.getBroadcast()=192.168.0.255
	getNetworkPrefixLength=24

getName获得网络设备名称=lo0
getDisplayName获得网络设备显示名称=lo0
	inetAddress.getAddress()=fe80:0:0:0:0:0:0:1%lo0
	getNetworkPrefixLength=64
	inetAddress.getAddress()=0:0:0:0:0:0:0:1%lo0
	getNetworkPrefixLength=128
	inetAddress.getAddress()=127.0.0.1
	getNetworkPrefixLength=8

NetworkInterface、InterfaceAddress和InetAddress这三者之间的关系:

在这里插入图片描述

//每个NetworkInterface有多个InterfaceAddress对象,从方法可以证明:
public java.util .List<Inter faceAddress> get Inter faceAddresses()

//而每一个InterfaceAddress对象只有一个InetAddress 对象,从方法可以证明:
public InetAddress getAddress ()

//间接着也代表每个NetworkInterface有多个InetAddress对象,从方法可以证明:
public Enumeration<InetAddress> getInetAadresses()

判断是否为点对点设备:

public boolean isPointToPoint():判断当前的网络设备是不是点对点设备。什么是pointtopoint(点对点)?它被设计的主要目的就是用来通过拨号或专线方式建立点对点连接以发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种通信解决方案。

//判断是否为点对点设备
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface next = networkInterfaces.nextElement();
            System.out.println("getName获得网络设备名称=" + next.getName());
            System.out.println("getDisplayName获得网络设备显示名称=" + next.getDisplayName());
            System.out.println("isPointToPoint是不是点对点设备=" + next.isPointToPoint());
            System.out.println();
        }
getName获得网络设备名称=utun1
getDisplayName获得网络设备显示名称=utun1
isPointToPoint是不是点对点设备=true

getName获得网络设备名称=utun0
getDisplayName获得网络设备显示名称=utun0
isPointToPoint是不是点对点设备=true

getName获得网络设备名称=llw0
getDisplayName获得网络设备显示名称=llw0
isPointToPoint是不是点对点设备=false

getName获得网络设备名称=awdl0
getDisplayName获得网络设备显示名称=awdl0
isPointToPoint是不是点对点设备=false

getName获得网络设备名称=en5
getDisplayName获得网络设备显示名称=en5
isPointToPoint是不是点对点设备=false

getName获得网络设备名称=en0
getDisplayName获得网络设备显示名称=en0
isPointToPoint是不是点对点设备=false

getName获得网络设备名称=lo0
getDisplayName获得网络设备显示名称=lo0
isPointToPoint是不是点对点设备=false

是否支持多播:

public boolean supportsMulticasst():判断当前的网络设备是否支持多播。

单播、广播和组播的作用总结如下:

  1. 单播:单台主机与单台主机之间的通信。
  2. 广播:单台主机与网络中所有主机的通信。
  3. 组播:单台主机与选定的一组主机的通信。
//判断多播
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface next = networkInterfaces.nextElement();
            System.out.println("getName获得网络设备名称=" + next.getName());
            System.out.println("getDisplayName获得网络设备显示名称=" + next.getDisplayName());
            System.out.println("supportsMulticast是否支持多地址广播=" + next.supportsMulticast());
            System.out.println();
        }
getName获得网络设备名称=utun1
getDisplayName获得网络设备显示名称=utun1
supportsMulticast是否支持多地址广播=true

getName获得网络设备名称=utun0
getDisplayName获得网络设备显示名称=utun0
supportsMulticast是否支持多地址广播=true

getName获得网络设备名称=llw0
getDisplayName获得网络设备显示名称=llw0
supportsMulticast是否支持多地址广播=true

getName获得网络设备名称=awdl0
getDisplayName获得网络设备显示名称=awdl0
supportsMulticast是否支持多地址广播=true

getName获得网络设备名称=en5
getDisplayName获得网络设备显示名称=en5
supportsMulticast是否支持多地址广播=true

getName获得网络设备名称=en0
getDisplayName获得网络设备显示名称=en0
supportsMulticast是否支持多地址广播=true

getName获得网络设备名称=lo0
getDisplayName获得网络设备显示名称=lo0
supportsMulticast是否支持多地址广播=true

NetworkInterface类静态方法

NetworkInterface类除了有getNetworkInterfaces()方法外,还有3个静态方法,分别介绍如下:

  1. public static NetworkInterface getByIndex(int index):根据指定的索引取得NetworkInterface对象。
  2. public static NetworkInterface getByName(String name):根据指定的NetworkInterface的name名称来获取NetworkInterface对象。
  3. public static NetworkInterface getByInetAddress(InetAddress addr):根据指定的InetAddress对象获得NetworkInterface。如果指定的IP地址绑定到多个网络接口,则不确定返回哪个网络接口。

根据索引获得NetworkInterface对象:

//根据索引获得NetworkInterface对象
        NetworkInterface networkInterface = NetworkInterface.getByIndex(1);
        System.out.println(networkInterface.getName());
lo0

根据网络接口名称获得NetworkInterface对象:

//根据网络接口名称获得NetworkInterface对象
        NetworkInterface networkInterface = NetworkInterface.getByName("lo0");
        System.out.println(networkInterface.getName() + " " + networkInterface.getIndex());
        
lo0 1

根据IP地址获得NetworkInterface对象:

//根据IP地址获得NetworkInterface对象
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        NetworkInterface networkInterface = NetworkInterface.getByInetAddress(inetAddress);
        System.out.println(networkInterface.getName());
        System.out.println(networkInterface.getDisplayName());
lo0
lo0

如果指定的IP地址绑定到多个网络接口,则不确定返回哪个网络接口,这个功能是可以实现的。在Linux中,bonding的含义是将多个物理的网卡抽象成1块网卡,能够提升网.络吞吐量,实现网络冗余、负载等功能,有很大的好处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值