原文地址:https://segmentfault.com/a/1190000007462741
以下为复盘学习笔记
[Q&A] 如何获取本机在局域网中的IP地址?
方式1:执行命令
Windows: Win+R
→ cmd
→ ipconfig
Linux : ifconfig
方式2:解析命令
调用本地命令(比如 Windows 上的 ipconfig 命令和 Linux 上的 ifconfig 命令),接着解析本地命令的输出,最后得到本机在局域网内的 IP 地址。
方式3:Java网络编程
Java 在 JDK1.4 的时候添加的一个类: NetworkInterface
。
Further Reading : What is NetworkInterface does?
getNetworkInterfaces() 返回当前机器上所有的网络接口
getInetAddresses() 返回绑定到该网卡的所有的 IP 地址(一个网络接口可以绑定多个 IP 地址,通常一个网络接口只对应一个 IP 地址)
[Q&A] 获得本机的所有IPV4网络IP
/** * 获取本机所有IPv4网络IP地址。 * <p> * 通过遍历本机的所有网络接口,获取与每个接口关联的IP地址, * 并筛选出IPv4类型的地址进行输出。对于无法访问或不存在的网络接口, * 方法会忽略并继续尝试下一个接口。 * * @throws SocketException 如果在获取网络接口或其IP地址时发生错误 */
public static void getLocalIPv4Address() throws SocketException {
// 获得本机的所有网络接口
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
while (nifs.hasMoreElements()) {
NetworkInterface nif = nifs.nextElement();
try {
// 获得与该网络接口绑定的 IP 地址
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
// 只关心 IPv4 地址
if (addr instanceof Inet4Address) {
System.out.printf("网卡接口名称:%s%n", nif.getName());
System.out.printf("网卡接口地址:%s%n", addr.getHostAddress());
}
}
} catch (Exception e) {
// 如果某个网络接口抛出异常,继续尝试下一个接口
if (e.getMessage().contains("no such network interface")) {
continue;
}
throw e; // 如果是其他类型的异常,重新抛出
}
}
}
网卡接口名称:lo
网卡接口地址:127.0.0.1
网卡接口名称:wlan2
网卡接口地址:192.168.137.1 (即为机器在局域网内的 IP 地址)
网卡接口名称:eth10
网卡接口地址:10.10.2.129
# Windows 平台上
wlan开头 局域网的网络接口
lo 本地回环地址
eth开头 VMware 创建的虚拟地址
[Q&A] Java 获取本机IP地址(windows or Linux)
原文链接:[实践总结] 如何获取本机在局域网中的IP地址?
错误使用
InetAddress localHost = InetAddress.getLocalHost();
localHost.getHostAddress();
windows 192.168.199.175
windows开一个vpn 2.0.0.137
windows网卡接口 此方法就不好使了
Linux 127.0.0.1
/etc/hosts的第一行一般均是:127.0.0.1 localhost,所以返回值是127.0.0.1
倘若你把第一行改为127.1.1.1 localhost,那么它的返回值就是127.1.1.1了
推荐方案
此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK
/** * 获取本地主机的IP地址。 * * <p>此方法通过Java的InetAddress类获取本地主机(本机网络接口)的IP地址,并返回一个字符串形式的IPv4或IPv6地址。 * 如果系统配置有多个网络接口,则可能返回其中一个活跃接口的IP地址。</p> * * @return 本地主机的IP地址,格式为标准的点分十进制表示法(对于IPv4)或冒号分隔十六进制表示法(对于IPv6) * @throws UnknownHostException 如果本地主机名无法解析成IP地址,或者没有可用的网络接口 * @throws SocketException 在某些情况下,如操作系统不允许访问网络接口信息时抛出异常 */
public static InetAddress fetchLocalIpAddress() throws SocketException, UnknownHostException {
InetAddress candidateAddress = null;
// 获得本机的网络接口
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface nif = networkInterfaces.nextElement();
// 获得与该网络接口绑定的IP地址
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress inetAddr = addresses.nextElement();
// 排除loopback环回类型地址
if (!inetAddr.isLoopbackAddress()) {
// 优先返回site-local地址
if (inetAddr.isSiteLocalAddress()) {
return inetAddr;
}
// 若不是site-local地址 那就记录下该地址当作候选
if (candidateAddress == null) {
candidateAddress = inetAddr;
}
}
}
}
// 如果除了环回地之外无其它地址了,那就回退到原始方案
return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress;
}
InetAddress localHostAddress = fetchLocalIpAddress();
System.out.println("网卡接口地址:" + localHostAddress.getHostAddress());
网卡接口地址:192.168.1.109
今天的文章如何获取局域网内所有ip_知道ip地址怎么算子网掩码分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85589.html