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); } } } }
补充说明
- 主机名解析原理:
getHostName()会先尝试DNS反向解析,如果失败(比如设备没注册DNS),会尝试NetBIOS查询(Windows设备常用),如果还是失败,就会返回IP地址本身。 - 可达性判断的局限:
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; } } - 权限问题:在Linux/macOS系统下,发送ICMP包可能需要root权限,如果遇到权限问题,可以改用TCP方式判断可达性。
内容的提问来源于stack exchange,提问作者Yash Mehta
相关产品推荐
相关产品推荐

