更新:
与此问题相关的项目已经发生了很大的变化,因为这篇文章是共享的,实际上我强烈建议避免使用TCP套接字传输图像,因为它会使传输速度变慢。我修复了通过UDP传输图像并将它们从YUV压缩到JPG而不是使用RGB的问题。这使得传输和重建图像的工作变得更加容易,因为您不必处理图像的每一层。
要知道图像的大小,我只需在UDP数据包的第一个字节处添加此信息即可,如果未正确接收到该大小,则套接字的超时将丢弃该数据包,并且通信在接收时仍然有效下一个UDP数据包。
由于这不是原始问题的答案,我会将其保留为未答复,以便其他具有相同问题的人可以找到解决方案并在此处发布。
------------------------原帖:-------------------- -------
首先感谢帮助并为我的英语道歉,我来自西班牙。
我正在使用套接字通过TCP从计算机接收图像。对于每个图像,我得到每层的层数(RGB),行数和列数,然后是每个像素的值。为了收集数据,我使用DataInputStream
。
通常它工作正常,但有时我得到错误的行数和列数值导致下一个函数出现问题,即应用程序冻结等待永远不会发送的数据,或者只是导致数组上的索引错误持有数据。
所以我想清除数据,如果行数和列数太高,但我找不到任何方法来清除DataInputStream
,错误的像素值字节。
另外,我不知道DataInputStream
的大小,因为大小是按照以下方式计算的:Layers * Width * height
。所以如果我没有得到这个阵营的真正价值,我就不知道我必须跳过的字节数。
问题:
任何人都知道如何清除DataInputStream
?
如果没有,我应该使用其他类型的输入法吗?
BufferedInputStream
答案 0 :(得分:3)
我怀疑你的问题不是关于清除输入流,而是更多关于在失去同步后找回来的问题。一种常见的方法是使用boundary-pattern(用于多部分html文档和mjpeg流)。因此,如果您在流中迷路,您将继续搜索此模式,直至找到它。
如果您真的想跳过字节,可以使用DataInputStream.skipBytes(int n)
方法。
答案 1 :(得分:0)
根据定义,只能按顺序访问流。可以跳过一些数据,但您必须知道要跳过多少字节。基本上,如果您的协议变得不同步并且不允许通过特殊的字节序列或类似方式进行同步,那么您唯一能做的就是关闭网络连接并重新建立它。
答案 2 :(得分:0)
当{em>两个端口的TCP连接使用Java时,DataInputStream
用于发送和接收原始Java类型。如果您只是从中读取字节,则可以使用普通InputStream
。
如果连接的两端确实在您的控制之下,则更好的方法是将数据捆绑到对象中并使用ObjectInputStream
。或HTTP,如果图像是标准格式。