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

被折叠的 条评论
为什么被折叠?



