Java TCP FIN 但没有内流 eof
Java TCP FIN but no instream eof
我一直在使用 org.apache.commons.net.telnet
连接到控制流并向相机发送命令。我发送一个数据流请求并打开一个新线程,该线程扫描来自相机传感器的图像并将数据作为原始字节发送给我。我正在使用标准 java.io 内流和外流进行阅读。我正在写入文件的外流....只是原始字节。但是,我陷入了读取套接字发送的数据的无限循环中。 instream.read()
> -1 让我保持在那里...我已经完成了 instream.available() > 0
,但这通常会缩短图像(可以理解)。我什至尝试了各种 and/ors,但永远无法完整阅读。
我已经在 Wireshark 中确认一切都在传递到我的程序并且发送了一个 FIN,但是由于某种原因,JAVA 没有获取 FIN 并给我 -1。文件的输出流保持打开状态,我从未从传感器获得 "complete" 图像扫描。 (我一直在手动关闭流并读取图像。最终目标是将此图像放入标签中,并将其用于动态偶尔的相机曝光更新。)
有没有什么方法可以检测 FIN 消息并告诉循环在 instream.read()
之外终止?
其他信息:Win 7(企业版)、Netbeans IDE
你真的觉得你的stream-read-code很特别,所以你不能发布?我对此表示怀疑。
.available()
不是对流结束的测试。它只是 returns 您可以安全读取而不会因等待传入数据而被阻塞的字节数。
图像数据结束后,你从流中得到了什么?
这是 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);
}
}
A instream.read() > -1
keeps me there
当然可以。它丢弃了一个字节,并且它首先不是一个有效的测试。您的读取循环应如下所示:
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);
}
我一直在使用 org.apache.commons.net.telnet
连接到控制流并向相机发送命令。我发送一个数据流请求并打开一个新线程,该线程扫描来自相机传感器的图像并将数据作为原始字节发送给我。我正在使用标准 java.io 内流和外流进行阅读。我正在写入文件的外流....只是原始字节。但是,我陷入了读取套接字发送的数据的无限循环中。 instream.read()
> -1 让我保持在那里...我已经完成了 instream.available() > 0
,但这通常会缩短图像(可以理解)。我什至尝试了各种 and/ors,但永远无法完整阅读。
我已经在 Wireshark 中确认一切都在传递到我的程序并且发送了一个 FIN,但是由于某种原因,JAVA 没有获取 FIN 并给我 -1。文件的输出流保持打开状态,我从未从传感器获得 "complete" 图像扫描。 (我一直在手动关闭流并读取图像。最终目标是将此图像放入标签中,并将其用于动态偶尔的相机曝光更新。)
有没有什么方法可以检测 FIN 消息并告诉循环在 instream.read()
之外终止?
其他信息:Win 7(企业版)、Netbeans IDE
你真的觉得你的stream-read-code很特别,所以你不能发布?我对此表示怀疑。
.available()
不是对流结束的测试。它只是 returns 您可以安全读取而不会因等待传入数据而被阻塞的字节数。图像数据结束后,你从流中得到了什么?
这是
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); } }
A
instream.read() > -1
keeps me there
当然可以。它丢弃了一个字节,并且它首先不是一个有效的测试。您的读取循环应如下所示:
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);
}