在java中获取TCP数据包的修复数量

时间:2016-02-24 16:43:02

标签: java sockets tcp

我正在获取数千个TCP数据包。我在一个数据包之后读了一个数据包,但我想在128个数据包之后读取整个128个数据包。目前,我使用

s = new Socket(ip, port);
byte[] buffer = new byte[some_length];
stream = s.getInputStream();
stream.read(buffer);

准确地说,128个包的每个有序序列对应于一个图像(之后将重建)。顺便说一句,每个TCP数据包的第一个字节对应于1128之间的数字,因此我可以将这些数字用作地标。

有没有办法,每当我将数据包的第一个字节设置为1时,按128的顺序读取这些数据包而不必编写专用循环(此循环将调用{{1} }次128)?

2 个答案:

答案 0 :(得分:1)

您在评论中说明每个数据包的长度确切为2048字节,而此数字的数量并不重要,重要的是长度是固定的。

有不同的读取固定长度数据包的方法:

在循环中使用InputStream.read

InputStream.read的调用可能无法完全填充缓冲区,即使您请求更多,也可能只填充1个字节。要解决这个问题,你需要读入一个while循环。

public byte[] readImage(InputStream in, int imageLength) throw IOException{
    byte[] out = new byte[imageLength];
    int read;
    for(int i = 0; read = in.read(out, i, imageLength - i); i += read) 
        if(read < 0)
             throw new EOFException();
    return out;
}

在上面的循环中,我们首先分配一个所需大小的字节数组,然后我们用我们的字节数组和当前索引调用in.read。这样,我们确信我们永远不会将半读取数据包返回给调用者

使用DataInput

您也可以使用DataInput.readFully完全读取字节数组,而不是手动重新发明轮子。这很简单:

byte[] image = new byte[imagelength];
DataInput in = new DataInputStream(inStream);
in.readFully(image);

答案 1 :(得分:0)

这是我如何进行

 DataInputStream dis = new DataInputStream(stream);

    byte[] buffer = new byte[len];
    while(buffer[0] !=1){
        dis.readFully(buffer);
    }

    byte[] tmpBuffer = new byte[len]; 
    byte[] finalBuffer = new byte[nb_line * len];
    int count_lines = 0;

    while(true){
        dis.readFully(tmpBuffer);
        System.arraycopy(tmpBuffer, 1, finalBuffer, (count_lines + 1) * rows, rows);
        count_lines++;
        if(count_lines == 127)
            break;
    }