Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中运行tshark以实时获取数据包?_Java_Real Time_Inputstream_Buffering_Tshark - Fatal编程技术网

如何在Java中运行tshark以实时获取数据包?

如何在Java中运行tshark以实时获取数据包?,java,real-time,inputstream,buffering,tshark,Java,Real Time,Inputstream,Buffering,Tshark,我在Java中运行tshark时遇到问题。数据包似乎是成批到达,而不是真正的实时到达(从终端运行时就是这样)。 我尝试了几种不同的方法: ArrayList命令=新建ArrayList(); 添加(“C:\\ProgramFiles\\Wireshark\\tshark.exe”); ProcessBuilder pb=新的ProcessBuilder(命令); Process进程=pb.start(); BufferedReader br=null; 试一试{ //为BufferedReade

我在Java中运行tshark时遇到问题。数据包似乎是成批到达,而不是真正的实时到达(从终端运行时就是这样)。 我尝试了几种不同的方法:

ArrayList命令=新建ArrayList();
添加(“C:\\ProgramFiles\\Wireshark\\tshark.exe”);
ProcessBuilder pb=新的ProcessBuilder(命令);
Process进程=pb.start();
BufferedReader br=null;
试一试{
//为BufferedReader的最后一个参数尝试了不同的数字
br=新的BufferedReader(新的InputStreamReader(process.getInputStream()),1);
字符串行=null;
而((line=br.readLine())!=null){
系统输出打印项次(行);
}
}抓住。。。
还尝试使用InputStream的available()方法,如中所示

我还使用以下代码尝试了NuProcess库:

NuProcessBuilder pb=新的NuProcessBuilder(命令);
ProcessHandler=newProcessHandler();
setProcessListener(processHandler);
numprocess=pb.start();
试一试{
进程。等待(0,时间单位。秒);
}捕捉(中断异常e){
e、 printStackTrace();
}
私有类ProcessHandler扩展了NuAbstractProcessHandler{
私有进程;
@凌驾
public void onStart(numprocess numprocess){
this.nuProcess=nuProcess;
}
@凌驾
公共无效OnStOut(ByteBuffer缓冲区){
if(buffer==null)
返回;
byte[]bytes=新字节[buffer.remaining()];
buffer.get(字节);
System.out.println(新字符串(字节));
}
}
这些方法都不管用。只有在嗅探到大约50个数据包时,数据包才会到达,就像被缓冲一样

你知道为什么会发生这种情况以及如何解决它吗?这很令人沮丧。当时我花了很多时间研究类似的问题,但没有一个有用


你看到我的代码中有错误吗?它在您的情况下有效吗?

我运行了一些测试,以查看BufferedReader与仅使用输入流相比可以完成多少缓冲

        ProcessBuilder pb = new ProcessBuilder("ls", "-lR", "/");

        System.out.println("pb.command() = " + pb.command());

        Process p = pb.start();
        byte ba[] = new byte[100];
        InputStream is = p.getInputStream();
        int bytecountsraw[] = new int[10000];
        long timesraw[] = new long[10000];
        long last_time = System.nanoTime();
        for (int i = 0; i < timesraw.length; i++) {
            int bytecount = is.read(ba);
            long time = System.nanoTime();
            timesraw[i] = time - last_time;
            last_time = time;
            bytecountsraw[i] = bytecount;
        }
        try (PrintWriter pw = new PrintWriter(new FileWriter("dataraw.csv"))) {
            pw.println("bytecount,time");
            for (int i = 0; i < timesraw.length; i++) {
                pw.println(bytecountsraw[i] + "," + timesraw[i] * 1.0E-9);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        int bytecountsbuffered[] = new int[10000];
        long timesbuffered[] = new long[10000];
        last_time = System.nanoTime();
        for (int i = 0; i < timesbuffered.length; i++) {
            String str = br.readLine();
            int bytecount = str.length();
            long time = System.nanoTime();
            timesbuffered[i] = time - last_time;
            last_time = time;
            bytecountsbuffered[i] = bytecount;
        }
        try (PrintWriter pw = new PrintWriter(new FileWriter("databuffered.csv"))) {
            pw.println("bytecount,time");
            for (int i = 0; i < timesbuffered.length; i++) {
                pw.println(bytecountsbuffered[i] + "," + timesbuffered[i] * 1.0E-9);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
ProcessBuilder pb=newprocessbuilder(“ls”、“-lR”、“/”;
System.out.println(“pb.command()=”+pb.command());
进程p=pb.start();
字节ba[]=新字节[100];
InputStream is=p.getInputStream();
int bytecountsraw[]=新int[10000];
long timesraw[]=新长[10000];
long last_time=System.nanoTime();
for(int i=0;i
我试图找到一个命令,该命令将保持尽可能快的打印速度,以便任何延迟都是由于缓冲和/或ProcessBuilder而不是命令本身造成的。下面是一个结果图


虽然我使用了一个名为DebugPlot的Netbeans插件,但您可以用excel打印csv文件。原始数据和缓冲数据之间没有太大差异。两者都是突发性的,大多数读取时间不到一微秒,峰值间隔为10到50毫秒。绘图的刻度以纳秒为单位,因此5E7的顶部为50毫秒或0.05秒。如果您进行了测试并获得了类似的结果,那么这可能是process builder所能做的最好的事情。如果使用tshark得到的结果比其他命令差得多,那么可能有一个选项可以使用tshark,或者数据包本身会突然出现。

正如tshark手册页所说:

   −l  Flush the standard output after the information for each packet is
       printed.  (This is not, strictly speaking, line‐buffered if −V was
       specified; however, it is the same as line‐buffered if −V wasn’t
       specified, as only one line is printed for each packet, and, as −l
       is normally used when piping a live capture to a program or script,
       so that output for a packet shows up as soon as the packet is seen
       and dissected, it should work just as well as true line‐buffering.
       We do this as a workaround for a deficiency in the Microsoft Visual
       C++ C library.)

       This may be useful when piping the output of TShark to another
       program, as it means that the program to which the output is piped
       will see the dissected data for a packet as soon as TShark sees the
       packet and generates that output, rather than seeing it only when
       the standard output buffer containing that data fills up.
尝试使用
-l
命令行参数运行tshark。

Java使用管道和许多C程序(包括
tshark
)处理子进程的输出(和输入),在写入管道时使用缓冲区。试图在Java读取端解决这个问题已经太晚了。请参阅,特别是最简单的答案:将
-l
选项指定为
tshark
。这解决了我的问题:)谢谢