java.io.EOFEException:at java.io.DataInputStream.readUTF(未知源)-逐行写入文件
我制作了一个简单的服务器-客户端应用程序,从服务器中逐行读取文件,并在客户端的新文件中逐行写入。应用程序正确地写入文件中的行,但当文件到达末尾时,我发现以下错误:java.io.EOFEException:at java.io.DataInputStream.readUTF(未知源)-逐行写入文件,java,Java,我制作了一个简单的服务器-客户端应用程序,从服务器中逐行读取文件,并在客户端的新文件中逐行写入。应用程序正确地写入文件中的行,但当文件到达末尾时,我发现以下错误: java.io.EOFException at java.io.DataInputStream.readUnsignedShort(Unknown Source) at java.io.DataInputStream.readUTF(Unknown Source) at java.io.DataInputStr
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at it.sendfile.socket.FileClient1.main(FileClient1.java:19)
我的代码:
公共类文件服务器1{
公共静态无效字符串[]args{
int端口=3000;
//开放服务器套接字
ServerSocket ss=null;
试一试{
ss=新的ServerSocketport;
插座s=ss.accept;
DataOutputStream outToClient=新建DataOutputStreams.getOutputStream;
文件testFile=newfilec:\\temp\\tmpbgoutge;
BufferedReader输入=新的BufferedReaderNewFileReaderTestFile;
弦线;
而line=input.readLine!=null{
outToClient.writeUTFline;
outToClient.writeUTF-------------;
outToClient.flush;
Thread.currentThread.sleep1000;
}
输入。关闭;
outToClient.close;
s、 接近;
}捕获异常e{
System.out.printlne.getMessage;
}
}
}
公共类FileClient1{
公共静态无效字符串[]args{
尝试PrintWriter out=new PrintWriternew filewriter:\\temp\\tmpbgoutcoge1.txt,true{
插座s=新插座本地主机,3000;
DataInputStream INFOROMSERVER=新DataInputStreamnew BufferedInputStreams.getInputStream;
虽然是真的{
字符串行=informserver.readUTF;
System.out.printlnline;
out.writeline;
out.println\n;
}
}捕捉异常{
//TODO自动生成的捕捉块
e、 打印跟踪;
}
}
}
当我到达文件末尾时,我必须找到一个While stop条件,但我尝试使用line=informserver.readUTF!=空,但它不工作。
在FileClient1类中,我无法关闭套接字和DataInputStream。一条消息说:无法访问的代码。您可以使用
while(inFromServer.available()>0) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
而不是
while (true) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
readUTF永远不会返回null。您需要在关闭之前发送一个“sentinel值”——一个指示流结束的特殊值
显然,您希望它是在正常用例中不太可能发送的东西。我建议\uffff使用长度为1的字符串,因为U+FFFF保证不是定义的字符。我尝试过该解决方案,但我收到另一个错误消息服务器端:对等方重置连接:套接字写入错误从不使用InputStream.available。显然,available并不表示EOF,它只表示您是否可以无阻塞地读取。非常感谢…它工作正常,这样我就可以关闭Datainputstream和套接字。