我正在获取数千个TCP数据包。我在一个数据包之后读了一个数据包,但我想在128个数据包之后读取整个128个数据包。目前,我使用
s = new Socket(ip, port);
byte[] buffer = new byte[some_length];
stream = s.getInputStream();
stream.read(buffer);
准确地说,128个包的每个有序序列对应于一个图像(之后将重建)。顺便说一句,每个TCP数据包的第一个字节对应于1
和128
之间的数字,因此我可以将这些数字用作地标。
有没有办法,每当我将数据包的第一个字节设置为1
时,按128的顺序读取这些数据包而不必编写专用循环(此循环将调用{{1} }次128
)?
答案 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;
}