You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java获取局域网远程PC名称与IP:仅能获取IP的问题求助

解决Java获取局域网远程设备名称的问题

我看了你的代码,发现问题出在获取设备名称的逻辑上——你现在循环里的name变量一直是本地主机的名称,根本没去请求远程设备的主机名,难怪拿不到目标PC的名字!

问题代码的核心错误

你这段代码里:

InetAddress name = InetAddress.getByName(N);

这里的N是本地主机名,所以不管循环到哪个IP,name始终是你自己电脑的名字,完全没涉及远程设备的解析。

修正后的代码

我们需要在确认远程IP可达后,直接调用该InetAddress对象的getHostName()方法来获取远程设备的名称:

import java.io.IOException;
import java.net.InetAddress;

public class FindIP {
    public static void main(String[] args) throws IOException {
        InetAddress localhost = InetAddress.getLocalHost();
        byte[] ip = localhost.getAddress();
        // 遍历局域网内的所有IP段(假设是C类子网)
        for (int i = 1; i <= 254; i++) {
            ip[3] = (byte) i;
            InetAddress address = InetAddress.getByAddress(ip);
            // 尝试1秒内判断是否可达
            if (address.isReachable(1000)) {
                // 直接通过address对象获取远程主机名
                String deviceName = address.getHostName();
                System.out.println("IP: " + address.getHostAddress() + " | 设备名称: " + deviceName);
            }
        }
    }
}

补充说明

  1. 主机名解析原理:getHostName()会先尝试DNS反向解析,如果失败(比如设备没注册DNS),会尝试NetBIOS查询(Windows设备常用),如果还是失败,就会返回IP地址本身。
  2. 可达性判断的局限:isReachable()依赖ICMP echo请求(类似ping),有些设备可能禁用了ICMP,或者你的程序没有足够权限发送ICMP包,这时候可以尝试用TCP连接来判断,比如连接远程设备的80/443/445端口:
    import java.net.Socket;
    import java.net.InetSocketAddress;
    import java.io.IOException;
    
    // 替代isReachable的TCP判断方式
    private static boolean isHostReachable(String ip, int timeout) {
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(ip, 445), timeout);
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    
  3. 权限问题:在Linux/macOS系统下,发送ICMP包可能需要root权限,如果遇到权限问题,可以改用TCP方式判断可达性。

内容的提问来源于stack exchange,提问作者Yash Mehta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:29