我正在研究基于分析网络流量的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_attempt
和time_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();