我一直在尝试创建一个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很新,因此我可能会错过一些非常明显的错误,但如果是这样,请告诉我:)
答案 0 :(得分: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()
编写密码,然后换行和刷新可能会有效。