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

本文深入解析Java网络编程中NetworkInterface、InterfaceAddress和InetAddress类的使用。详细介绍了如何获取网络接口信息,包括IP地址、子网掩码、广播地址及网络前缀长度,同时探讨了点对点设备和多播的支持情况。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

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块网卡,能够提升网.络吞吐量,实现网络冗余、负载等功能,有很大的好处。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>我们正在讨论的是Debian系(如Ubuntu)中通过`/etc/network/interfaces`配置静态IP的方法。 根据引用[1][2][3][4],该文件用于配置网络接口,包括静态IP、子网掩码、网关等。 步骤: 1. 打开配置文件:`sudo vi /etc/network/interfaces` 2. 配置静态IP:假设网卡为eth0,添加以下内容: auto eth0 # 表示系统启动时自动激活该接口 iface eth0 inet static # 指定使用IPv4静态配置 address 192.168.1.100 # IP地址 netmask 255.255.255.0 # 子网掩码 gateway 192.168.1.1 # 网关 dns-nameservers 8.8.8.8 192.168.1.1 # DNS服务器(可选,也可在/etc/resolv.conf中配置) 3. 保存并退出 4. 重启网络服务:`sudo systemctl restart networking` 或 `sudo /etc/init.d/networking restart` 注意: - 如果有多块网卡,可以分别配置(如eth0, eth1)[^4]。 - 也可以配置MAC地址(如引用[3]中的`hwaddress ether 02:01:02:03:04:08`),但通常不需要。 - 确保网卡名称正确(使用`ip link`查看)。 示例配置(参考引用[3][4]): ``` auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 ``` 验证: - `ip addr show eth0` - `ping 8.8.8.8` - `nslookup google.com` 注意:在Ubuntu 18.04及更高版本中,默认使用Netplan,但如果你没有安装Netplan(比如服务器版可能仍然使用interfaces),则可以用此方法。 相关问题: 1. 如何为多个网卡配置静态IP? 2. 配置静态IP后网络不通,如何排查? 3. 在Ubuntu 18.04及以上版本中,如何切换回使用/etc/network/interfaces? 4. 如何配置静态IPv6地址? 5. 如何临时禁用网络接口? 引用说明: [^1]: 解读下/etc/network/interfaces配置文件 [^2]: Linux网卡配置之 /etc/network/interfaces [^3]: 如何配置/etc/network/interfaces。配置静态ip,同时设置mac地址 [^4]: 在linux中通过 /etc/network/interfaces 配置静态ip</think>### 在 Linux 中通过 `/etc/network/interfaces` 配置静态 IP 地址(Debian/Ubuntu 系) #### 配置步骤: 1. **打开配置文件** ```bash sudo nano /etc/network/interfaces ``` 2. **配置静态 IP(以网卡 `eth0` 为例)** ```bash # 启用网卡自启动 auto eth0 # 配置 IPv4 静态地址 iface eth0 inet static address 192.168.1.100 # 静态 IP 地址 netmask 255.255.255.0 # 子网掩码 gateway 192.168.1.1 # 网关 dns-nameservers 8.8.8.8 # DNS 服务器(可多个) # 可选:配置 MAC 地址 hwaddress ether 00:11:22:33:44:55 ``` > **关键参数说明**: > - `auto eth0`:系统启动时自动激活网卡 > - `inet static`:使用 IPv4 静态配置 > - `address`:静态 IP 地址 > - `netmask`:子网掩码(也可用 CIDR 格式如 `192.168.1.100/24`) > - `dns-nameservers`:DNS 服务器(空格分隔多个) 3. **保存并重启网络服务** ```bash sudo systemctl restart networking # Ubuntu 16.04+ # 或 sudo /etc/init.d/networking restart # 旧版系统 ``` 4. **验证配置** ```bash ip addr show eth0 # 检查 IP 配置 ping 8.8.8.8 # 测试网络连通性 nslookup google.com # 测试 DNS 解析 ``` #### 多网卡配置示例(引用[4]) ```bash auto eth0 iface eth0 inet static address 192.168.100.2 netmask 255.255.255.0 auto eth1 iface eth1 inet static address 192.168.100.3 netmask 255.255.255.0 ``` #### 注意事项: 1. **网卡名称**: 使用 `ip link` 查看实际网卡名(现代系统可能为 `enp0s3` 而非 `eth0`) 2. **备份配置**: ```bash sudo cp /etc/network/interfaces /etc/network/interfaces.bak ``` 3. **DNS 备用配置**: 若需全局 DNS,可编辑 `/etc/resolv.conf`: ```bash nameserver 8.8.8.8 nameserver 1.1.1.1 ``` 4. **Ubuntu 18.04+**: 新版默认使用 Netplan,如需切回传统配置: ```bash # 创建符号链接 sudo ln -s /etc/network/interfaces /etc/netplan/01-custom.yaml ``` > **故障排查**: > - 若重启失败:`journalctl -xe` 查看日志 > - 检查网关可达性:`ip route show` > - 临时禁用 NetworkManager:`sudo systemctl stop NetworkManager`[^2] --- ### 相关问题 1. 如何为 Ubuntu 22.04 配置静态 IP(使用 Netplan)? 2. 配置静态 IP 后无法连接外网,如何逐步排查? 3. 如何通过命令行临时修改 IP 地址(无需重启)? 4. `/etc/network/interfaces` 和 `/etc/netplan` 配置有何本质区别? 5. 如何为同一网卡配置多个 IP 地址(IP 别名)? [^1]: 解读下/etc/network/interfaces配置文件 [^2]: Linux网卡配置之 /etc/network/interfaces [^3]: 如何配置/etc/network/interfaces。配置静态ip,同时设置mac地址 [^4]: 在linux中通过 /etc/network/interfaces 配置静态ip
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值