我正在获取数千个 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 的序列读取这些数据包,而无需编写专用循环(此循环将调用 128
次stream.read(buffer);
)?
最佳答案
您在评论中指出每个数据包的长度都是 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);
关于java - 在java中获取固定数量的TCP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35607997/