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

Java实现同一WIFI网络下设备IP检测 现有代码无输出如何修正

问题原因
  • 打印逻辑缺失:InetAddress.isReachable()返回false属于正常执行,不会触发异常,原代码仅在主机可达、或解析报错时才会输出内容,绝大多数场景下没有任何输出逻辑,自然看不到结果。
  • isReachable底层兼容性差:非管理员/root权限运行Java程序时,isReachable()不会发送ICMP ping包,只会尝试连接目标主机的TCP 7端口(echo服务),99%的设备不会开启这个端口,所以即使设备在线也会返回false。
  • 网段硬编码错误:你固定写死了192.168.0作为子网前缀,绝大多数家用WIFI的子网是192.168.1.x、192.168.31.x等其他网段,网段不匹配自然扫不到任何设备。
  • 串行扫描效率极低:单线程逐个扫描254个地址,每个超时1秒的话完整扫描需要254秒,你看到的短暂停顿后退出大概率是程序还没跑完就被终止,或者全量扫描完也没有符合打印条件的结果。
正确实现方案

采用「调用系统原生ping命令 + 多线程并行扫描」的方案,兼容性最好,不需要额外权限,扫描速度快:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class LanScanner {
    // 调整为你实际的WIFI子网前缀,比如你的IP是192.168.1.100,就填"192.168.1"
    private static final String SUBNET_PREFIX = "192.168.1";
    private static final int SCAN_THREADS = 50;
    private static final int PING_TIMEOUT_MS = 1000;

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(SCAN_THREADS);
        for (int i = 1; i < 255; i++) {
            String host = SUBNET_PREFIX + "." + i;
            executor.execute(() -> {
                if (isHostReachable(host)) {
                    System.out.println(host + " 在线");
                }
            });
        }
        executor.shutdown();
        executor.awaitTermination(5, TimeUnit.MINUTES);
        System.out.println("扫描完成");
    }

    private static boolean isHostReachable(String host) {
        try {
            ProcessBuilder pb;
            // 区分Windows和Unix系系统的ping命令参数
            if (System.getProperty("os.name").toLowerCase().contains("win")) {
                pb = new ProcessBuilder("ping", "-n", "1", "-w", String.valueOf(PING_TIMEOUT_MS), host);
            } else {
                pb = new ProcessBuilder("ping", "-c", "1", "-W", String.valueOf(PING_TIMEOUT_MS / 1000), host);
            }
            Process process = pb.start();
            int exitCode = process.waitFor();
            // ping命令返回0代表主机可达
            return exitCode == 0;
        } catch (Exception e) {
            return false;
        }
    }
}
使用注意事项
  • 先确认你当前连接WIFI的网段:Windows下打开cmd输入ipconfig查看无线网卡的IPv4地址,macOS/Linux下输入ifconfig或ip addr查看,比如你的IP是192.168.31.24,就把代码里的SUBNET_PREFIX改为192.168.31。
  • 不需要管理员权限运行,50线程的情况下10秒左右即可完成全网段扫描。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:36:02