在我的应用程序中,为什么readInt()总是抛出一个EOFException?

时间:2009-03-22 06:54:13

标签: java multithreading exception networking sockets

(原谅我,因为我不经常用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。

2 个答案:

答案 0 :(得分:0)

你是在写4个字节到套接字吗?根据JavaDoc,如果此流在读取所有字节之前到达末尾,它将抛出EOFException。

尝试连续4次调用readByte()而不是readInt(),看看会发生什么(可能并非所有情况都有效)。

编辑(给定您的编辑)。

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

当read()返回-1时,表示它已经命中了文件的末尾。

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

这听起来像是一个问题,或者读取代码在执行握手时读取的内容比您的内容更多,或者另一方面没有写出您认为正在编写的内容。

答案 1 :(得分:0)

要检查的一些事项:

  • 握手是否消耗超过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。