文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java获取本机IP地址的代码怎么写

2023-06-30 12:10

关注

本文小编为大家详细介绍“Java获取本机IP地址的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java获取本机IP地址的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

前言

在Java中如何准确的获取到本机IP地址呢?网上大部分的做法是InetAddress.getLocalHost().getHostAddress()。这的确能获取到本机IP地址,但是是不准确的。因为忽略了一个问题,网络环境是多变的,一台计算机不同的网卡有多个IP地址,Lan、WiFi、蓝牙、热点、虚拟机网卡等。

一、规则

二、获取

1.使用

 public static void main(String[] args) throws SocketException {        System.out.println( IpUtil.getLocalIp4Address().get().toString().replaceAll("/",""));    }

2.工具类

package com.dingwen.test.utils;import org.springframework.util.ObjectUtils;import java.net.*;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.Optional;public class IpUtil {        public static List<Inet4Address> getLocalIp4AddressFromNetworkInterface() throws SocketException {        List<Inet4Address> addresses = new ArrayList<>(1);        // 所有网络接口信息        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();        if (ObjectUtils.isEmpty(networkInterfaces)) {            return addresses;        }        while (networkInterfaces.hasMoreElements()) {            NetworkInterface networkInterface = networkInterfaces.nextElement();            //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头            if (!isValidInterface(networkInterface)) {                continue;            }            // 所有网络接口的IP地址信息            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();            while (inetAddresses.hasMoreElements()) {                InetAddress inetAddress = inetAddresses.nextElement();                // 判断是否是IPv4,并且内网地址并过滤回环地址.                if (isValidAddress(inetAddress)) {                    addresses.add((Inet4Address) inetAddress);                }            }        }        return addresses;    }        private static boolean isValidInterface(NetworkInterface ni) throws SocketException {        return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual()                && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens"));    }        private static boolean isValidAddress(InetAddress address) {        return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();    }        private static Optional<Inet4Address> getIpBySocket() throws SocketException {        try (final DatagramSocket socket = new DatagramSocket()) {            socket.connect(InetAddress.getByName("8.8.8.8"), 10002);            if (socket.getLocalAddress() instanceof Inet4Address) {                return Optional.of((Inet4Address) socket.getLocalAddress());            }        } catch (UnknownHostException networkInterfaces) {            throw new RuntimeException(networkInterfaces);        }        return Optional.empty();    }        public static Optional<Inet4Address> getLocalIp4Address() throws SocketException {        final List<Inet4Address> inet4Addresses = getLocalIp4AddressFromNetworkInterface();        if (inet4Addresses.size() != 1) {            final Optional<Inet4Address> ipBySocketOpt = getIpBySocket();            if (ipBySocketOpt.isPresent()) {                return ipBySocketOpt;            } else {                return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0));            }        }        return Optional.of(inet4Addresses.get(0));    }}

参考:

https://www.jianshu.com/p/f619663f0f0a

https://www.cnblogs.com/starcrm/p/7071227.html

下面在分享一段Java获取本机IP地址的示例代码

import java.net.*;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.Objects;import java.util.Optional;public class IpUtil {        public static List<Inet4Address> getLocalIp4AddressFromNetworkInterface() throws SocketException {        List<Inet4Address> addresses = new ArrayList<>(1);        // 所有网络接口信息        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();        if (Objects.isNull(networkInterfaces)) {            return addresses;        }        while (networkInterfaces.hasMoreElements()) {            NetworkInterface networkInterface = networkInterfaces.nextElement();            //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头            if (!isValidInterface(networkInterface)) {                continue;            }            // 所有网络接口的IP地址信息            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();            while (inetAddresses.hasMoreElements()) {                InetAddress inetAddress = inetAddresses.nextElement();                // 判断是否是IPv4,并且内网地址并过滤回环地址.                if (isValidAddress(inetAddress)) {                    addresses.add((Inet4Address) inetAddress);                }            }        }        return addresses;    }        private static boolean isValidInterface(NetworkInterface ni) throws SocketException {        return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual()                && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens"));    }        private static boolean isValidAddress(InetAddress address) {        return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();    }        private static Optional<Inet4Address> getIpBySocket() throws SocketException {        try (final DatagramSocket socket = new DatagramSocket()) {            socket.connect(InetAddress.getByName("8.8.8.8"), 10002);            if (socket.getLocalAddress() instanceof Inet4Address) {                return Optional.of((Inet4Address) socket.getLocalAddress());            }        } catch (UnknownHostException networkInterfaces) {            throw new RuntimeException(networkInterfaces);        }        return Optional.empty();    }        public static Optional<Inet4Address> getLocalIp4Address() throws SocketException {        final List<Inet4Address> inet4Addresses = getLocalIp4AddressFromNetworkInterface();        if (inet4Addresses.size() != 1) {            final Optional<Inet4Address> ipBySocketOpt = getIpBySocket();            if (ipBySocketOpt.isPresent()) {                return ipBySocketOpt;            } else {                return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0));            }        }        return Optional.of(inet4Addresses.get(0));    }}

读到这里,这篇“Java获取本机IP地址的代码怎么写”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯