(原谅我,因为我不经常用Java编写。)
我正在用Java编写客户端网络应用程序,我遇到了一个有趣的问题。每次调用readInt()都会抛出EOFException
。变量属于DataInputStream
类型(初始化为:DataInputStream din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
,其中sock
的类型为Socket
)。
现在,sock.isInputShutdown()
返回false
,socket.isConnected()
返回true
。我假设这意味着我与我正在连接的另一台机器有一个有效的连接。我还进行了其他检查以确保我已正确连接到另一台机器。
DataInputStream
是否可能无法正确设置?有没有我错过的先决条件?
非常感谢任何帮助。
@tofubeer:我实际上写了17个字节到套接字。套接字连接到另一台机器,我正在等待该机器的输入(如果不清楚,我很抱歉)。我首先成功地从流中读取(发起握手),这很好用。我现在正在检查我的发送请求是否格式错误,但我认为它们不是。此外,我尝试从流中读取单个字节(通过read()
)并返回-1。
答案 0 :(得分:0)
你是在写4个字节到套接字吗?根据JavaDoc,如果此流在读取所有字节之前到达末尾,它将抛出EOFException。
尝试连续4次调用readByte()而不是readInt(),看看会发生什么(可能并非所有情况都有效)。
编辑(给定您的编辑)。
找出在获得-1之前可以调用read()的次数。
当read()返回-1时,表示它已经命中了文件的末尾。
还要找出每个read()返回的内容,以确保您正在阅读的内容是您实际写出的内容。
这听起来像是一个问题,或者读取代码在执行握手时读取的内容比您的内容更多,或者另一方面没有写出您认为正在编写的内容。
答案 1 :(得分:0)
要检查的一些事项:
编辑:我看了一下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。