【问题标题】:Java EOFException Server/Client TCP applicationJava EOFException 服务器/客户端 TCP 应用程序
【发布时间】:2012-05-30 01:18:07
【问题描述】:

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

1 的示例:

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

示例 2:

while (connection open) {
    processPacket(in)
}

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

如果这是问题所在,任何人都知道我如何同步它们以在保持当前更新速度并使用两个线程的同时继续执行此操作?

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

如何修复 EOFException?

【问题讨论】:

    标签: java tcp client packet


    【解决方案1】:

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

    这是一个类似的 SO question

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

    【讨论】:

      【解决方案2】:

      两个线程不应读取同一个 Stream。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-15
          • 1970-01-01
          • 2011-03-21
          • 2012-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多