当前位置: 首页 > 知识库问答 >
问题:

Java TCP FIN,但无流内eof

邓阳伯
2023-03-14

我一直在使用org.apache.commons.net。telnet连接到控制流并向摄像机发送命令。我发送一个数据流请求并打开一个新线程,该线程扫描来自摄像机传感器的图像,并将数据作为原始字节发送给我。我使用的是标准java。io流入和流出以读取。我正在向文件中写入的扩展流……只是原始字节。然而,我在读取套接字发送的数据时陷入了一个无限循环。Ainstream.read()

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

是否有某种方法可以检测FIN消息并告诉循环在流内读取()之外终止?

其他信息:Win 7(企业版),Netbeans IDE

共有2个答案

章阳波
2023-03-14
匿名用户

>

  • 你真的认为你的流读代码很特别,所以你不能发布它?我对此表示怀疑。

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

    图像数据结束后,你从流中得到了什么?

    这是InputStream使用的示例,我100%确定它是有效的并且正确处理eof-s、异常和流关闭等:

     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);
         }
     }
    

  • 关翰
    2023-03-14

    Ainstream.read()

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

    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);
    }
    

     类似资料:
    • 问题内容: 基本上,这是在尝试回答另一个问题时出现的。假设此代码: 我了解以下事实:这是 无序的无限流 ,要使其完成,必须进行短路操作(在这种情况下)。我也了解,在达到该限制之前,可以随意调用Stream实现多次。 在java-8下运行此命令,将始终打印(可能不总是打印,但在我的机器上是这样)。 相反,在java-10下运行this很少超过。所以我的问题是内部发生了什么变化,从而使短路发生得更好了

    • 我试图理解为什么下面的Java程序给出了< code>OutOfMemoryError,而对应的程序却没有< code >。parallel()没有。 我有两个问题: > 该程序的预期输出是什么? 不带<代码>。parallel()看起来这只是输出< code>sum(1 2 3...)这意味着它只是“停留”在平面图中的第一个流,这是有意义的。 对于并行,我不知道是否有预期的行为,但我的猜测是它以

    • 有时,在处理流的两个步骤之间对流中的每个元素进行“处理”(例如打印)会很方便,例如调试。 一个简单的例子可能是这样的,不幸的是,这不起作用,因为消耗流: 如何做到这一点?

    • 我试图从多个内存流生成一个PDF文件,但在确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法时遇到了很多困难,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流并不包含这两个文件的组合。 我很难确定将2个PDF MemoryStream合并为一个PDF

    • 我有一个相当复杂的过程,需要几个层次的嵌套for循环。 只针对一组特定的条件执行操作。换句话说:

    • 我在使用SharpZipLib的GZipInputStream编写未压缩的GZIP流时遇到问题。我似乎只能获得256字节的数据,其余的数据没有写入并保留为零。已检查压缩流(compressedSection),所有数据都在那里(1500字节)。解压缩过程的片段如下: 因此,在这段代码中: 1) 压缩的部分被传入,准备解压缩。 2) 未压缩输出的预期大小(以2字节小endian值的形式存储在文件头中