2011-02-03 54 views
3

我有一个来自黑匣子的输入流(比如说B)。从这个流进入的所有消息都是序列化的二进制数据,每个消息都以四个字节的int开头。它大部分是日志记录数据,每天运行24小时。我用readInt()方法读取这四个字节。现在,偶尔,主线程会退出EOFException,并使程序崩溃。如何在输入字节流上设置readInt()块?

经过研究,我发现它发生在readInt()时输入流中少于四个字节时发生。我的猜测是缓冲区在连续读取之间的填充速度不够快。我正在考虑的一些可能的解决方案包括在读取之前检查available()(考虑数据量时消耗太多周期),或者在发生异常时重启(听起来像编程不佳)。如果只有我可以阻止使用readInt(),我认为这将是最好的方式。我已经看过readInt()的实现,但它又归结为使用read()进行阻塞。

任何人都知道更好的解决方案吗?

+1

您似乎通过生成文本墙来阻止阅读流程;-)引入一些段落可能会使其更具可读性(并有助于获得答案)。 – 2011-02-03 14:32:27

+0

`readInt()`的方法是什么? – axtavt 2011-02-03 14:37:51

+0

你读什么样的流? – 2011-02-03 14:49:06

回答

1

任何阻止调用层次结构的调用都是“绑定”的,以使所有的调用都成为链式阻塞,因为这两个调用都是同一个执行线程的一部分。 DataInputStreamreadInt方法对基础输入流的read方法进行了四次调用,只要数据不可用,就肯定会阻止此方法,因此您对“缓冲区填充不够快”的恐惧似乎并不是逻辑。

在服务器进程死亡或丢失连接的情况下,我遇到了这种异常,在这种情况下客户端最终读取-1并引发异常。你是否在客户/服务器代码中吞噬任何异常?你的日志显示任何可疑的东西?

1

我相信你正在使用DataInputStream。那个类抛出EOFException,当它包装的流从read()方法返回-1(实际上阻塞直到输入数据可用)。

我想,你应该看看为什么主流的读取返回-1首先。

0

基本InputStream接口需要阻塞读取,你得到的EOFException类时的readInt()遇到流标记的结束,因为返回不完整的INT将是一个坏主意,它抛出的E被抛出第二Ø f F ile异常。

EOFException被抛出,因为流的另一端到达其结尾,已关闭或不再连接。你应该检查黑盒是否终止连接。

由于流是基于网络的,因此您的套接字可能会设置超时值,如果是这种情况,请尝试更改套接字的值SOTimeout