У меня проблема с запуском tshark в Java. Кажется, что пакеты поступают навалом, а не в реальном времени (как это происходит при запуске с терминала). я попробовал несколько различных подходов:Как запустить tshark в Java для получения пакетов в режиме реального времени?
ArrayList<String> command = new ArrayList<String>();
command.add("C:\\Program Files\\Wireshark\\tshark.exe");
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
BufferedReader br = null;
try {
//tried different numbers for BufferedReader's last parameter
br = new BufferedReader(new InputStreamReader(process.getInputStream()), 1);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch...
также попытался с помощью метода InputStream в доступной(), как показано на What does InputStream.available() do in Java?
Я также попытался библиотеку NuProcess со следующим кодом:
NuProcessBuilder pb = new NuProcessBuilder(command);
ProcessHandler processHandler = new ProcessHandler();
pb.setProcessListener(processHandler);
NuProcess process = pb.start();
try {
process.waitFor(0, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
private class ProcessHandler extends NuAbstractProcessHandler {
private NuProcess nuProcess;
@Override
public void onStart(NuProcess nuProcess) {
this.nuProcess = nuProcess;
}
@Override
public void onStdout(ByteBuffer buffer) {
if (buffer == null)
return;
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
System.out.println(new String(bytes));
}
}
Ни один из методы работают. Пакеты всегда поступают, как если бы они буферизовались, только когда около 50 были обнюханы.
У вас есть идеи, почему это может произойти и как его решить? Это довольно неприятно. Я потратил много времени на подобные вопросы в SO, но никто из них не помог.
Вы видите ошибки в моем коде? Это работает в вашем случае?
Java обрабатывает выходные данные (и ввод) дочернего процесса, используя каналы, и множество программ на C, включая 'tshark', буфер при записи в канал. Попытка исправить это на стороне чтения Java слишком поздно. См. Http://unix.stackexchange.com/questions/72428/cant-process-stdout-with-pipe-as-it-comes и, в частности, самый простой ответ: укажите параметр '-l' для' tshark'. –
это решило мою проблему :) спасибо – illus2003