当前位置: 首页 > article >正文

Java 获取本地ip网卡信息

工具类

  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));
    }

    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 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 isValidAddress(InetAddress address) {
        return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();
    }

    /**
     * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头
     *
     * @param ni 网卡
     * @return 如果满足要求则true,否则false
     */
    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"));
    }

获取本机ip

getLocalIp4Address().get().getHostAddress()

http://www.kler.cn/news/136743.html

相关文章:

  • C#基础知识-枚举
  • Mysql-count(1)、count(*)和count(列名)的区别?
  • LabVIEW提高开发效率技巧----节省内存
  • 构建未来:AI初创企业的投资桥梁 —— AI Angels Fund
  • 基于KV260的基础视频链路通路(MIPI+Demosaic+VDMA)
  • docker常用命令整理
  • Linux系统中sz和rz命令详解(文件传输、上传、下载)
  • 使用k8s部署一个简单MySQL8服务,但是不能挂载
  • 二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
  • Linux文本处理工具awk用法总结
  • python 对比数据库,生成sql
  • 大型 APP 的性能优化思路
  • 【STL】string类 (上) <vector>和<list>的简单使用
  • 为什么几乎所有的量化交易都用Python?
  • Vue项目Jenkins自动化部署
  • python实战—数据分析与图表1(QQ群聊天数据分析) lv2
  • android生成jks文件
  • 放大招:腾讯云5年服务器和3年轻量应用服务器租用价格表
  • 高压放大器使用方法介绍
  • 【Spring Boot】使用WebSocket协议完成来单提醒及客户催单功能
  • 【rosrun diagnostic_analysis】报错No module named rospkg | ubuntu 20.04
  • 对OpenAI CEO奥特曼突然被解雇事件的一些分析
  • DCDC同步降压控制器SCT82A30\SCT82630
  • RoCE、IB和TCP等网络的基本知识及差异对比
  • 用平板当电脑副屏(spacedesk)双端分享
  • 安装2023最新版PyCharm来开发Python应用程序