首页 > 解决方案 > 检查嵌套循环的缓冲区

问题描述

我正在研究基于分析网络流量的java项目。我创建了从 pcap 扩展名中的输入和输出文件上传数据的类(我从它们上传了时间和数据包的大小)。我对主对数有疑问,哪个任务正在检查缓冲区条件。我必须检查缓冲区空了多少次和多长时间,尝试从缓冲区输出数据包失败的次数和最终缓冲区大小。

我在 analysis_buffer 方法中创建了逻辑,它按时间顺序设置时间,这意味着:如果 output_time 大于 input_time,则 output_size 将添加到缓冲区(buffer_size),如果 input_size 较大,则 input_size 从缓冲区中减去。

我正在使用嵌套循环,首先是输入文件长度,第二个循环(内部)是输出文件长度。应用程序正在运行,但最终输出不正确,变量等于 0(只有缓冲区大小太大)。我不知道我还需要在代码中更改什么,有什么建议吗?

import org.jnetpcap.util.PcapPacketArrayList;

public class Buffer {

int buffer_size =0;      //initial size the buffer
int failed_attempt =0;    //count unsuccessful attempt to output packet from the buffer
double time_empty = 0;    //time for which buffer was empty
int count_empty =0;       //count for which buffer was empty

public Buffer(int buffer_size) {
    this.buffer_size = buffer_size;
}

public Buffer() {
    // TODO Auto-generated constructor stub
}


public void analysis_buffer(PcapPacketArrayList packetArrayList, PcapPacketArrayList packetArrayList2, double[] input_time, double[] output_time, int[] input_size, int[] output_size) {


    for (int i = 0; i < packetArrayList.size(); i++) {

        for (int j = 0; j < packetArrayList2.size(); j++) {

            // if output time is greater than input time, add input size to main buffer size
            if (input_time[i] < output_time[j]) {
                buffer_size = buffer_size + input_size[i];              
                }

            //  if input time is greater than output time, we have 3 options
            //  1. buffer size is greater than output size packet and output is subtracting from buffer size
            //  2. buffer size is smaller than output packet - buffer size is automatically equal 0 
            //  3. buffer size is equal 0, I'm increasing unsuccessful attempt to get out of the buffer and saves time when buffer was empty 

            else if (input_time[i] > output_time[j]) {

                    if(output_size[j] < buffer_size) {                                      
                        buffer_size = buffer_size - output_size[j];
                        }

                    if(output_size[j] > buffer_size) {
                        buffer_size = 0;
                        count_empty++;
                        }

                    if(buffer_size == 0) {
                        failed_attempt++;
                        time_empty = time_empty + (output_time[j+1]-output_time[j]);
                        }
                    }               

            // if input time is equal output time, add and subtract packets from buffer size, or buffer size is automatically equal 0
            else if (input_time[i] == output_time[j]) {

                if(output_size[j] < buffer_size) {
                    buffer_size = buffer_size + input_size[i] - output_size[j];
                    }

                if(output_size[j] > (buffer_size + input_size[i])){
                    buffer_size = 0;
                    count_empty++;
                    }
                }               
            }
        }
    }


public void check_buffer() {

    System.out.println("Initial buffer size was 0");
    System.out.println("Final buffer size: " + buffer_size +".");
    System.out.println("Buffer was empty " + count_empty +" times.");
    System.out.println("Failed attempt to output data from the buffer: " + failed_attempt +" times.");
    System.out.println("Total time for which the buffer was empty: " + time_empty + " seconds.");
    }
}

我的输出:

初始缓冲区大小为 0

最终缓冲区大小:1227700210。

缓冲区为空 1 次。

尝试从缓冲区输出数据失败:0 次。

缓冲区为空的总时间:0.0 秒。

标签: javaloops

解决方案


我已经用这些值尝试了你的代码:

String[] p = new String[4];
String[] p2 = new String[4];
double[] it = {5432d, 4234d, 6345d, 64320d, 8534d};
double[] ot = {5436d, 4234d, 6342d, 64326d, 8534d};
int[] is = {45, 654, 79, 16354, 4563};
int[] os = {65, 641, 98, 23346, 9846};
Buffer buffer = new Buffer();
buffer.analysis_buffer(p, p2, it, ot, is, os);
buffer.check_buffer();

我得到了这个结果:

Initial buffer size was 0
Final buffer size: 16354.
Buffer was empty 3 times.
Failed attempt to output data from the buffer: 3 times.
Total time for which the buffer was empty: 62200.0 seconds.

failed_attempttime_empty变量只在这个地方被修改:

if(buffer_size == 0) {
  failed_attempt++;
  time_empty = time_empty + (output_time[j+1]-output_time[j]);
}

我认为条件尚未满足(使用您的测试值),也许下一个都没有:

if(output_size[j] > buffer_size) {
  buffer_size = 0;
  count_empty++;
}

else if (input_time[i] > output_time[j]) {

顺便说一句,尝试解决这个问题:

java.lang.ArrayIndexOutOfBoundsException: 5
    at Buffer.analysis_buffer(Buffer.java:47)

使用这些值:

String[] p = new String[5];
String[] p2 = new String[5];
double[] it = {5432d, 4234d, 6345d, 64320d, 8534d};
double[] ot = {5436d, 4234d, 6342d, 64326d, 8534d};
int[] is = {45, 654, 79, 16354, 4563};
int[] os = {65, 641, 98, 23346, 9846};
Buffer buffer = new Buffer();
buffer.analysis_buffer(p, p2, it, ot, is, os);
buffer.check_buffer();

推荐阅读