检查嵌套循环上的缓冲区



我正在研究基于分析网络流量的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 秒。

我已经尝试了使用以下值的代码:

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();

最新更新