0

我在我的应用程序中运行 2 个线程。一种用于检查传入数据包,另一种用于处理和发送数据包。他们都在同一条线上做这件事。

示例 1:

while (connection open) {
    in.readObject() instanceof ...
}

示例 2:

while (connection open) {
    processPacket(in)
}

我很确定 EOFException 是线程尝试同时使用流的时候。这不是一个恒定的 EOF,但就像每 1 秒我得到一个 EOF 一样,其余的工作正常。所以这就是为什么我怀疑它们重叠并尝试同时使用流。

如果这是问题所在,任何人都知道我如何在保持当前更新速度并使用两个线程的同时将它们同步到一个又一个?

我需要两个线程,因为对传入的检查会排成一行,直到收到数据包,并且我需要服务器不断发送进程并检查数据包。

如何修复 EOFException?

4

3 回答 3

1

如果您收到 EOFException,通常意味着对方挂断了。你通常会在阅读端得到这些。

这是一个类似的SO问题

编辑1:问题真的是为什么套接字关闭了。这可能是由于多种原因,服务器端的可编程计时器在 X 分钟内检查没有数据,防火墙关闭连接,网络中断等。

于 2012-05-23T16:55:18.950 回答
1

两个线程不应该读取同一个流。

您应该读取对象并将它们放在 ConcurrentLinkedQueue 中,然后从第二个线程中您可以检查队列中准备处理的对象。

于 2012-05-23T18:43:57.303 回答
1

EOFException 是“正常的”。它也发生在一个线程上。您在两个线程中同时读取的架构不可能工作,但这不是这个问题的原因。原因是对端关闭了连接。这将会发生。除非您的应用程序协议包含消息计数或关闭通知或其他一些预测 EOS 的方法,否则它将获得 EOFExceptions,或 readLine() 返回 null,或 read() 返回 -1,具体取决于您调用的读取方法。

于 2012-05-23T22:12:38.107 回答