【问题标题】:In my application, why does readInt() always throw an EOFException?在我的应用程序中,为什么 readInt() 总是抛出 EOFException?
【发布时间】:2009-03-22 06:54:13
【问题描述】:

(原谅我,因为我不经常用 Java 编写代码。)

我正在用 Java 编写客户端网络应用程序,但遇到了一个有趣的问题。每次调用 readInt() 都会抛出一个EOFException。该变量的类型为DataInputStream(初始化为:DataInputStream din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));,其中sock 的类型为Socket)。

现在,sock.isInputShutdown() 返回 falsesocket.isConnected() 返回 true。我假设这意味着我与我正在连接的另一台机器建立了有效的连接。我还执行了其他检查以确保我已正确连接到另一台机器。

DataInputStream 是否设置不正确?有没有我遗漏的先决条件?

非常感谢任何帮助。


@tofubeer:我实际上向套接字写入了 17 个字节。套接字已连接到另一台机器,我正在等待该机器的输入(如果不清楚,我很抱歉)。我首先成功地从流中读取(以启动握手),这工作得很好。我现在正在检查我发送的请求是否格式错误,但我认为不是。另外,我尝试从流中读取一个字节(通过read()),它返回-1。

【问题讨论】:

  • 发布源代码会有所帮助。还可以尝试通过其他方式验证远程端是否正常工作。

标签: java multithreading exception networking sockets


【解决方案1】:

您是否正在向套接字写入 4 个字节?根据 JavaDoc,如果此流在读取所有字节之前到达末尾,它将引发 EOFException。

尝试连续调用 readByte() 4 次而不是 readInt() 看看会发生什么(可能不是所有的都可以)。

编辑(根据您的编辑)。

找出在获得 -1 之前可以调用 read() 的次数。

当 read() 返回 -1 时,意味着它已经到达文件末尾。

还要找出每个 read() 返回的内容,以确保您正在阅读的内容是您实际写出的内容。

这听起来像是一个问题,要么是在握手时读取的代码比你读的多,要么是对方没有写你认为它正在写的东西。

【讨论】:

  • 我在原帖中对此作出了回应。感谢您迄今为止的帮助。
【解决方案2】:

需要检查的一些事项:

  • 握手消耗的字节数是否超过 13 个字节,而 readInt() 的字节数少于 4 个?
  • 您要读取的整数是否通过 DataOutputStream.writeInt() 写入?
  • 您是否刷新了来自发送方的流?

编辑:我查看了 Java 源代码(我的桌面上有 1.4 的源代码,不确定您使用的是哪个版本),问题可能出在 BufferedInputStream 中。 DataInputStream.readInt() 只是调用了 BufferedInputStream.read() 四次。 BufferedInputStream.read() 调用 BufferedInputStream.fill() 如果它的缓冲区已用尽(例如,如果它的第一次读取只有 16 个字节)。 BufferedInputStream.fill() 调用底层 InputStream 的 read(byte[], int, int) 方法,根据合同,它实际上可能不会读取任何内容!如果发生这种情况,BufferedInputStream.read() 将返回错误的 EOF。

这一切都假设我正确阅读了所有这些内容,但情况可能并非如此。我只是快速浏览了一下来源。

我怀疑您的 BufferedInputStream 在第一次读取时只获得了流的前 16 个字节。我很好奇你的 DataInputStream 的 available() 在 readInt 之前返回了什么。如果您还没有,我建议您在写入无法读取的 int 后刷新 OutputStream 作为一种可能的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多