Java 实例 – 获取本机ip地址及主机名(超详细)

Java 实例 – 获取本机ip地址及主机名

在开发网络应用时,我们常常需要知道当前机器的网络信息,比如本机的 IP 地址和主机名。这在配置服务、调试连接、日志记录或实现本地通信时非常关键。Java 提供了标准库来帮助我们轻松获取这些信息,今天我们就通过一个完整的 Java 实例,带你一步步掌握如何获取本机 IP 地址与主机名。

想象一下,你的电脑是一栋房子,主机名就是门牌号,而 IP 地址就是这个房子在互联网地图上的坐标。有了这两个信息,别人就能精准找到你。而 Java 就是那个帮你查看地图和门牌号的工具。


什么是本机 IP 地址和主机名?

在计算机网络中,主机名(Hostname)是设备在网络中的名称,比如 DESKTOP-ABC123my-laptop.local。它通常是用户自定义或系统自动生成的,便于人类识别。

IP 地址(IP Address)是设备在网络中的唯一数字标识,比如 192.168.1.100(IPv4)或 fe80::1c7d:84c2:1a2f:3b4c(IPv6)。它由网络协议分配,是机器之间通信的基础。

在 Java 中,我们可以通过 InetAddress 类来获取这些信息。这个类就像是一个“网络身份证查询系统”,能告诉你当前机器的“身份信息”。


使用 InetAddress 获取本机主机名与 IP 地址

Java 的 java.net.InetAddress 类是获取网络信息的核心工具。我们可以通过 getLocalHost() 方法获取本机的地址信息。

下面是一个完整的 Java 实例代码:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class GetLocalHostInfo {
    public static void main(String[] args) {
        try {
            // 获取本机的 InetAddress 实例
            InetAddress localhost = InetAddress.getLocalHost();

            // 获取主机名
            String hostname = localhost.getHostName();
            System.out.println("主机名: " + hostname);

            // 获取 IP 地址
            String ipAddress = localhost.getHostAddress();
            System.out.println("IP 地址: " + ipAddress);

        } catch (UnknownHostException e) {
            // 当无法解析主机名时会抛出异常
            System.err.println("无法获取本机信息: " + e.getMessage());
        }
    }
}

代码解析

  • InetAddress.getLocalHost():这是获取本机地址的核心方法。它会尝试通过系统配置获取当前机器的网络信息。
  • getHostName():返回主机名,例如 MyPClaptop-2024
  • getHostAddress():返回 IP 地址,如 192.168.1.100
  • try-catch 块用于处理 UnknownHostException 异常。这个异常在系统无法解析主机名时触发,比如 DNS 配置错误或网络异常。

⚠️ 注意:如果本机没有配置网络,或者 hosts 文件中没有正确映射主机名,就可能触发异常。所以加异常处理是必要的。


多种方式获取 IP 地址:区分 IPv4 与 IPv6

现代系统可能同时支持 IPv4 和 IPv6。InetAddress 类可以自动选择最合适的地址,但你也可以手动控制。

示例:获取所有可用 IP 地址

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

public class GetAllIPAddresses {
    public static void main(String[] args) {
        try {
            // 获取本机 InetAddress 实例
            InetAddress localhost = InetAddress.getLocalHost();

            // 获取所有可能的 IP 地址(包括 IPv4 和 IPv6)
            InetAddress[] allAddresses = InetAddress.getAllByName(localhost.getHostName());

            System.out.println("主机名: " + localhost.getHostName());
            System.out.println("所有可用 IP 地址:");

            for (InetAddress addr : allAddresses) {
                System.out.println("  - " + addr.getHostAddress() + " (" + addr.getClass().getSimpleName() + ")");
            }

        } catch (UnknownHostException e) {
            System.err.println("无法解析主机名: " + e.getMessage());
        }
    }
}

输出示例

主机名: MyLaptop
所有可用 IP 地址:
  - 192.168.1.100 (InetAddress)
  - fe80::1c7d:84c2:1a2f:3b4c (InetAddress)

关键点说明

  • InetAddress.getAllByName(hostname):这个方法会返回一个 InetAddress 数组,包含该主机名对应的所有 IP 地址。
  • 你可以通过 getClass().getSimpleName() 来判断是 IPv4 还是 IPv6 地址。
  • 在局域网中,你可能会看到多个地址,比如 192.168.x.x(局域网 IP)和 fe80::...(链路本地 IPv6 地址)。

如何判断是 IPv4 还是 IPv6?

有时候你只关心 IPv4 地址,比如要启动一个 Web 服务器,只监听 IPv4。Java 提供了方法来判断地址类型。

import java.net.InetAddress;
import java.net.UnknownHostException;

public class CheckIPVersion {
    public static void main(String[] args) {
        try {
            InetAddress localhost = InetAddress.getLocalHost();

            // 判断是否为 IPv4 地址
            if (localhost.getAddress().length == 4) {
                System.out.println("IP 地址是 IPv4: " + localhost.getHostAddress());
            } else if (localhost.getAddress().length == 16) {
                System.out.println("IP 地址是 IPv6: " + localhost.getHostAddress());
            } else {
                System.out.println("未知 IP 地址类型: " + localhost.getHostAddress());
            }

        } catch (UnknownHostException e) {
            System.err.println("无法获取本机信息: " + e.getMessage());
        }
    }
}

说明

  • IPv4 地址用 4 字节表示,所以 getAddress().length == 4
  • IPv6 地址用 16 字节表示,所以 getAddress().length == 16
  • 这种方式适合在需要区分协议版本的场景使用,比如配置防火墙、绑定端口等。

实际应用场景:日志记录与服务启动

在开发 Web 服务器或微服务时,你经常需要在启动时打印出服务的访问地址。比如:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class ServerStartup {
    public static void main(String[] args) {
        try {
            InetAddress localHost = InetAddress.getLocalHost();
            String hostname = localHost.getHostName();
            String ipAddress = localHost.getHostAddress();

            System.out.println("=================================");
            System.out.println("服务已启动");
            System.out.println("主机名: " + hostname);
            System.out.println("IP 地址: " + ipAddress);
            System.out.println("访问地址: http://" + ipAddress + ":8080");
            System.out.println("=================================");

        } catch (UnknownHostException e) {
            System.err.println("启动失败:无法获取本机信息");
            e.printStackTrace();
        }
    }
}

输出示例

=================================
服务已启动
主机名: MyPC
IP 地址: 192.168.1.100
访问地址: http://192.168.1.100:8080
=================================

这个实例在真实项目中非常实用,能帮助开发人员快速确认服务是否正确部署。


常见问题与解决方案

问题 原因 解决方案
报错 UnknownHostException 主机名无法解析 检查 hosts 文件或网络配置
获取到 127.0.0.1 系统错误映射本机 使用 getAllByName() 获取真实地址
获取到 fe80::... 但无法访问 链路本地地址不能跨网络 优先使用 192.168.x.x 类地址
多个 IP 地址,不知道用哪个 网络接口多 根据用途选择:局域网用 IPv4,公网用公网 IP

💡 小贴士:在 Windows 上,可以使用 ipconfig 命令查看本机 IP;在 Linux/macOS 上,使用 ifconfigip a


总结:Java 实例 – 获取本机ip地址及主机名

通过本文,我们深入学习了如何使用 Java 获取本机的 IP 地址和主机名。从基础的 InetAddress.getLocalHost(),到获取所有地址、判断 IP 版本,再到实际应用中的服务启动日志,你已经掌握了一套完整的实用技能。

这个 Java 实例不仅适用于初学者理解网络编程基础,也对中级开发者在实际项目中快速定位问题、优化配置非常有帮助。记住:网络信息是程序与外界沟通的“门牌号”,掌握它,你就掌握了连接世界的第一步。

无论你是做本地测试、开发服务器,还是部署微服务,这些代码都能直接复用。下次写程序时,不妨加一句“打印本机信息”,让调试变得更轻松。

Java 实例 – 获取本机ip地址及主机名,看似简单,实则基础而重要。希望你能把它当作一个“网络身份证查询器”,用在每一个需要确认“我在哪”的时刻。