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

标签 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 的序列读取这些数据包,而无需编写专用循环(此循环将调用 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/

相关文章:

java - 使用 Java 的 AWS S3 文件搜索

java - 如何让递归算法在完成运行之前返回一个值?

PHP 自定义 SMTP 邮件函数返回错误 fputs 发送字节失败 errno=32 Broken pipe

c - 在C程序中构建docker镜像

C - 如何确定 JSON 消息的字节数

java - 在 Java 中将 HTML 与图像一起转换为 DOC

ios - Swift iOS 和 Java Sockets 之间的 TCP 通信

java - Jmeter Socket中的TCP Sampler连接错误

delphi - Indy 写缓冲/高效 TCP 通信

java - 递归地Uzip文件夹-android