Java TCP FIN 但没有流入 eof

Java TCP FIN but no instream eof

提问人:Aaron Clemons 提问时间:1/4/2016 最后编辑:RaedwaldAaron Clemons 更新时间:6/29/2020 访问量:188

问:

我一直在用它来连接到控制流并向相机发送命令。我发送一个数据流请求并打开一个新线程,该线程扫描来自相机传感器的图像并将数据作为原始字节发送给我。我正在使用标准 java.io 流和外流进行阅读。我正在写入文件的外流......只有原始字节。但是,我陷入了无限循环,读取套接字发送的数据。一个>-1让我留在那里......我已经做到了,但这通常会缩短图像(这是可以理解的)。我什至尝试了各种和/或,但永远无法完整阅读。org.apache.commons.net.telnetinstream.read()instream.available() > 0

我已经在 Wireshark 中确认所有内容都传递到我的程序并发送了 FIN,但由于某种原因,JAVA 没有获取 FIN 并给我 -1。文件的输出保持打开状态,我从未从传感器获得“完整”图像扫描。(我一直在手动杀死流并阅读图像。最终目标是将此图像放入标签中,并用于偶尔的相机曝光更新。

有没有办法检测 FIN 消息并告诉循环在外部终止?instream.read()

其他信息: Win 7 (enterprise build), Netbeans IDE

Java 套接字 TCP telnet eof

评论


答:

0赞 ankhzet 1/4/2016 #1
  1. 你真的认为你的流读代码很特别,所以你不能发布它吗?我对此表示怀疑。

  2. .available()不是对流结束的测试。它只是返回您可以安全读取的字节数,而不会被阻止等待传入数据。

  3. 图像数据结束后,您究竟从流中得到了什么?

  4. 以下是用法示例,我 100% 确定它是有效的,并且正确处理 -s、异常和流关闭等:InputStreameof

     static final int BUFFER_SIZE = 1024 * 32;
    
     public static ByteBuffer buffer(InputStream stream) throws IOException {
         // try (<resourse>) to properly handle 'stream.close()`
         try (BufferedInputStream reader = new BufferedInputStream(stream)) {
             byte[] buffer = new byte[BUFFER_SIZE];
             ByteBuffer result = ByteBuffer.allocate(BUFFER_SIZE);
    
             int totalReaded = 0, readed;
             while ((readed = reader.read(buffer)) >= 0) {
                 if (readed > result.remaining()) {
                     // well, we've exceeded capacity of given buffer, make it grow
                     ByteBuffer t = result;
                     result = (ByteBuffer) ByteBuffer.allocate((int)((totalReaded + readed) * 1.3));
                     result.put(t.array(), 0, totalReaded);
                 }
    
                 totalReaded += readed;
                 result.put(buffer, 0, readed);
             }
    
             return ByteBuffer.wrap(result.array(), 0, totalReaded);
         }
     }
    
1赞 user207421 1/4/2016 #2

A让我留在那里instream.read() > -1

当然可以。它丢弃了一个字节,它首先不是一个有效的测试。读取循环应如下所示:

int ch;
while ((ch = instream.read()) != -1)
{
    // ... Cast ch to a byte and use it somehow ...
}

或者这个:

int count;
byte[] buffer = new byte[8192];
while ((count = instream.read(buffer)) > 0)
{
    // ...
    // for example:
    out.write(buffer, 0, count);
}

评论

0赞 Aaron Clemons 1/4/2016
哎呀!就是这样。谢谢!