gpt4 book ai didi

java - 在java中获取固定数量的TCP数据包

转载 作者:行者123 更新时间:2023-12-01 10:21:11 26 4
gpt4 key购买 nike

我正在获取数千个 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 的序列读取这些数据包,而无需编写专用循环(此循环将调用 128stream.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com