千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"Java获取本机IP地址的代码怎么写",内容详细,步骤清晰,细节处理妥当,希望这篇"Java获取本机IP地址的代码怎么写"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
千家信息网最后更新 2026年11月01日Java获取本机IP地址的代码怎么写

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

前言

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

一、规则

  • 127.xxx.xxx.xxx 属于 "loopback" 地址,即只能你自己的本机可见,就是本机地址,比较常见的有 127.0.0.1

  • 192.168.xxx.xxx 属于 private 私有地址 (site local address),属于本地组织内部访问,只能在本地局域网可见

  • 同样 10.xxx.xxx.xxx、从 172.16.xxx.xxx 到172.31.xxx.xxx 都是私有地址,也是属于组织内部访问

  • 169.254.xxx.xxx 属于连接本地地址(link local IP),在单独网段可用

  • 从 224.xxx.xxx.xxx 到 239.xxx.xxx.xxx 属于组播地址

  • 比较特殊的 255.255.255.255 属于广播地址

  • 除此之外的地址就是点对点的可用的公开 IPv4 地址

二、获取

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;/** * 获取本机IP 地址 * * @author dingwen * 2021.04.28 11:49 */public class IpUtil {    /*     * 获取本机所有网卡信息   得到所有IP信息     * @return Inet4Address>     */    public static List getLocalIp4AddressFromNetworkInterface() throws SocketException {        List addresses = new ArrayList<>(1);        // 所有网络接口信息        Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();        if (ObjectUtils.isEmpty(networkInterfaces)) {            return addresses;        }        while (networkInterfaces.hasMoreElements()) {            NetworkInterface networkInterface = networkInterfaces.nextElement();            //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头            if (!isValidInterface(networkInterface)) {                continue;            }            // 所有网络接口的IP地址信息            Enumeration inetAddresses = networkInterface.getInetAddresses();            while (inetAddresses.hasMoreElements()) {                InetAddress inetAddress = inetAddresses.nextElement();                // 判断是否是IPv4,并且内网地址并过滤回环地址.                if (isValidAddress(inetAddress)) {                    addresses.add((Inet4Address) inetAddress);                }            }        }        return addresses;    }    /**     * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是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"));    }    /**     * 判断是否是IPv4,并且内网地址并过滤回环地址.     */    private static boolean isValidAddress(InetAddress address) {        return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();    }    /*     * 通过Socket 唯一确定一个IP     * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的     * @return Inet4Address>     */    private static Optional 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();    }    /*     * 获取本地IPv4地址     * @return Inet4Address>     */    public static Optional getLocalIp4Address() throws SocketException {        final List inet4Addresses = getLocalIp4AddressFromNetworkInterface();        if (inet4Addresses.size() != 1) {            final Optional 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;/** * 获取本机IP 地址 */public class IpUtil {    /*     * 获取本机所有网卡信息   得到所有IP信息     * @return Inet4Address>     */    public static List getLocalIp4AddressFromNetworkInterface() throws SocketException {        List addresses = new ArrayList<>(1);        // 所有网络接口信息        Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();        if (Objects.isNull(networkInterfaces)) {            return addresses;        }        while (networkInterfaces.hasMoreElements()) {            NetworkInterface networkInterface = networkInterfaces.nextElement();            //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头            if (!isValidInterface(networkInterface)) {                continue;            }            // 所有网络接口的IP地址信息            Enumeration inetAddresses = networkInterface.getInetAddresses();            while (inetAddresses.hasMoreElements()) {                InetAddress inetAddress = inetAddresses.nextElement();                // 判断是否是IPv4,并且内网地址并过滤回环地址.                if (isValidAddress(inetAddress)) {                    addresses.add((Inet4Address) inetAddress);                }            }        }        return addresses;    }    /**     * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是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"));    }    /**     * 判断是否是IPv4,并且内网地址并过滤回环地址.     */    private static boolean isValidAddress(InetAddress address) {        return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();    }    /*     * 通过Socket 唯一确定一个IP     * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的     * @return Inet4Address>     */    private static Optional 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();    }    /*     * 获取本地IPv4地址     * @return Inet4Address>     */    public static Optional getLocalIp4Address() throws SocketException {        final List inet4Addresses = getLocalIp4AddressFromNetworkInterface();        if (inet4Addresses.size() != 1) {            final Optional 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地址的代码怎么写"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

地址 网卡 本机 信息 回环 网络 代码 名字 开头 接口 活动 多个 文章 内容 就是 方式 时候 私有 不同 妥当 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江苏根荣互联网科技 科技创新与互联网经济 亿策互联网科技 上海万想互联网科技 多迪互联网科技有限公司 汉立互联网科技有限公司联系电话 互联网汽车科技小镇 互联网科技热点资讯 随着互联网科技发展 互联网科技创新服务 崇明区互联网教育科技售后服务 宜昌元轩互联网科技有限公司 消费医药和互联网科技 玉溪新华互联网科技好不好 滨湖区互联网智能科技产品有哪些 互联网科技圈年度人物 合肥互联网科技公司公章图片 伍佰万互联网科技怎么赚钱 皮皮虾互联网科技有限公司 互联网对科技影响 互联网巨头反垄断金融科技 广州互联网科技公司 九亚互联网科技 互联网科技公司的市场部门 互联网科技产品 青岛中康互联网医疗科技有限公司 浙南科技城互联网大厦招聘 互联网高科技行业有哪些企业 易租星互联网科技有限公司 深圳互联网科技园地址
0