Java 网络编程——获得本机在局域网内的 IP 地址

本文介绍如何使用Java的NetworkInterface类获取本机在局域网中的IP地址,包括获取所有网络接口及其绑定的IP地址,并提供了一个简单的代码示例。

1、问题提出
在使用 Java 开发网络程序时,有时候我们需要知道本机在局域网中的 IP 地址。很常见的一种做法是调用本地命令(比如 Windows 上的 ipconfig 命令和 Linux 上的 ifconfig 命令),接着解析本地命令的输出,最后得到本机在局域网内的 IP 地址。很明显,这种做法不够方便,也不够 Java。于是引出了 Java 在 JDK1.4 的时候添加的一个类: NetworkInterface

2、寻找方法
顾名思义,NetworkInterface 用于表示一个网络接口,这可以是一个物理的网络接口,也可以是一个虚拟的网络接口,而一个网络接口通常由一个 IP 地址来表示。既然 NetworkInterface 用来表示一个网络接口,那么如果可以获得当前机器所有的网络接口(包括物理的和虚拟的),然后筛选出表示局域网的那个网络接口,那就可以得到机器在局域网内的 IP 地址。

查看 NetworkInterface 类的所有方法,发现如下两个方法:

public static Enumeration<NetworkInterface> getNetworkInterfaces()

通过 API 文档可知,使用 getNetworkInterfaces 方法即可得到当前机器上所有的网络接口。

public Enumeration<InetAddress> getInetAddresses()

通过 API 文档可知,getInetAddresses 方法返回绑定到该网卡的所有的 IP 地址。(虽然一个网络接口确实可以绑定多个 IP 地址,然而通常情况下,一个网络接口都是只对应一个 IP 地址)

3、代码测试
在Ubuntu平台进行测试NetworkInterface

package day25;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class Test {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();

            while (nifs.hasMoreElements()) {
                NetworkInterface nif = nifs.nextElement();
                Enumeration<InetAddress> address = nif.getInetAddresses();
                while (address.hasMoreElements()) {
                    InetAddress addr = address.nextElement();
                    if (addr instanceof Inet4Address) {
                        System.out.println("网卡名称:" + nif.getName());
                        System.out.println("网络接口地址:" + addr.getHostAddress());
                        System.out.println();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:
网卡名称:eno1
网络接口地址:10.221.99.172

网卡名称:lo
网络接口地址:127.0.0.1

参考链接:
https://segmentfault.com/a/1190000007462741
https://segmentfault.com/a/1190000007599375?utm_source=sf-similar-article
https://segmentfault.com/a/1190000007731383?utm_source=sf-similar-article
https://blog.youkuaiyun.com/cold___play/article/details/106600394

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值