0

我一直在尝试创建一个 Java 程序,该程序最终将用于使用 hostapd 和 dnsmasq 包控制 Linux 中的 Wi-Fi 接入点(它们分别是接入点和 DNS/DHCP 服务器)。

至关重要的是,我可以在 hostapd 执行时读取它的 StdOut,因为它返回的数据必须经过解析才能向用户显示重要数据。

为此,我使用以下代码:

// Start access point
MainFrame.instance.setStatus("Starting access point...");
List<String> cmd = new ArrayList<String>();

// sudo hostapd /etc/hostapd.conf
cmd.add("/usr/bin/sudo");
cmd.add("/usr/sbin/hostapd");
cmd.add("/etc/hostapd.conf");

ProcessBuilder ps = new ProcessBuilder();
ps.command(cmd);
ps.redirectErrorStream(true);
Process p = ps.start();

//Process p = Runtime.getRuntime().exec("sudo hostapd /etc/hostapd.conf");

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
MainFrame.instance.setStatus("Running");
MainFrame.instance.setRunning(true);
while ((line = input.readLine()) != null) {
    System.out.println(line);
    output += (line + '\n');
    if (line.contains("AP-STA-CONNECTED")) {
        addClientToList(line);
    } else if (line.contains("AP-STA-DISCONNECTED")) {
        removeClientFromList(line);
    }
}
input.close();

但是,在 hostapd 终止之前不会返回任何数据。sudo hostapd /etc/hostapd.conf如果用户在终端中执行相同的命令 ( ),则数据显示正确。为什么我无法从 InputStream 中获取数据?

我对Java相当陌生,所以这里可能有一些我错过的非常明显的错误,但如果是这样,请告诉我:)

4

1 回答 1

0

编辑:添加屏幕截图后,这似乎不是问题。那么您可能正在阻止 AWT 事件线程,因此它无法重新绘制 GUI。GUI 仅在 AWT 线程空闲时更新。为了解决该问题,请在单独的线程中执行您的代码。

new Thread("Data Fetcher", new Runnable()
{
     public void run()
     {
          // Here comes your original code you posted.
     }
}). start();

但是,一旦您的应用程序投入生产,请记住这一点:

sudo最有可能提示输入管理员密码。我记得有一个gksudo会弹出一个对话框并让您输入密码。

我从未测试过它,但是通过 写入密码p.getOutputStream(),后跟换行符和刷新可能会起作用。

于 2013-08-03T10:06:45.937 回答