3

更新:

自从分享这篇文章以来,与这个问题相关的项目已经发生了很大变化,实际上我强烈建议避免使用 TCP 套接字传输图像,因为它会使传输速度变慢。我修复了通过 UDP 传输图像并将它们从 YUV 压缩为 JPG 而不是使用 RGB 的问题。这使得传输和重建图像的工作更容易,因为您不必处理图像的每一层。

要知道图像的大小,我只需在 UDP 数据包的第一个字节添加此信息,因此如果未正确接收大小,则套接字超时将丢弃该数据包,并且在接收下一个 UDP 时通信仍然有效包。

由于这不是原始问题的答案,因此我将其保留为未回答,以便其他有相同问题的人可以找到解决方案并将其发布在此处。

------------------------ 原帖:------------ ----

首先感谢您的帮助并为我的英语道歉,我来自西班牙。

我正在使用套接字通过 TCP 从计算机接收图像。对于每张图像,我得到层数 (RGB)、每一层的行和列,然后是每个像素的值。为了收集数据,我使用DataInputStream.

通常它工作正常,但有时我得到错误的行数和列数值,导致下一个函数出现问题,即应用程序冻结等待永远不会发送的数据,或者只是导致保存数据的数组出现索引错误.

因此,如果行数和列数过多,我想清除数据,但是我找不到任何方法来清除DataInputStream充满错误字节的像素值。

另外,我不知道 的大小DataInputStream,因为大小是按以下方式计算的:Layers * Width * height. 所以如果我没有得到这个阵营的真实值,我就无法知道我必须跳过的字节数。

问题:

  1. 任何人都知道一些方法来清除 aDataInputStream吗?

  2. 如果不是,我应该使用另一种输入方式 BufferedInputStream吗?

4

3 回答 3

1

我怀疑您的问题实际上并不是关于清除输入流,而是更多关于在不同步后找到一个背部。一种常见的方法是使用边界模式(在多部分 html 文档和 mjpeg 流中使用)。因此,如果您迷失在流中,您将继续搜索此模式,直到找到它为止。

如果你真的想跳过字节,你可以使用DataInputStream.skipBytes(int n)方法。

于 2012-06-14T08:26:32.880 回答
0

根据定义,流只能按顺序访问。跳过一些数据是可能的,但您必须知道要跳过多少字节。本质上,如果您的协议变得不同步并且不允许通过特殊的字节序列或类似方式进行同步,您唯一能做的就是关闭网络连接并重新建立它。

于 2012-06-14T08:27:30.173 回答
0

ADataInputStream旨在用于在 TCP 连接的两端都使用 Java时发送和接收原始 Java 类型。如果您只是从中读取字节,则可以使用普通的InputStream.

如果连接的两端确实在您的控制之下,更好的方法是将数据捆绑到一个对象中并使用ObjectInputStream. 或 HTTP,如果图像是标准格式。

于 2012-06-14T09:01:10.753 回答