您好 我正在构建一个小的p2p程序,实现服务器端和客户端。 当我在客户端程序中吃午餐时,首先想到的是连接到列表中的每个服务器,发送数据(关于客户端)并断开连接。下次客户端连接到其中一个服务器时,它将被识别。
我的问题 - 当我告诉客户端断开连接时,我得到了这个异常
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 oop.ex3.nameserver.NameServerThread.run(NameServerThread.java:24)
断开我刚刚写道:
finally {
out.close();
in.close();
socket.close();
}
所以,我该如何避免这种异常?谢谢!
答案 0 :(得分:10)
Socket.close()的JavaDoc明确指出:
关闭此套接字也将关闭 套接字的InputStream和 输出流。
会抛出异常,因为你已经关闭它们了!
答案 1 :(得分:0)
当您关闭客户端时,您希望在服务器端发生什么?
要避免此异常,您需要实现自己的readUnsignedShort()方法,如。
public int readUnsignedShort() {
int ch1 = in.read();
int ch2 = in.read();
if ((ch1 | ch2) < 0)
// don't throw new EOFException();
return -1; // EOF marker.
return (ch1 << 8) + (ch2 << 0);
}
答案 2 :(得分:0)
在关闭输出流之前是否正确执行刷新?:
finally {
//this is the DataOutputStream
if(dout != null){
dout.flush();
dout.close();
}
//and this the OutputStream
if(out != null){
out.flush();
out.close();
}
if (din != null){
din.close();
}
if (in != null){
in.close();
}
if (socket != null){
socket.close();
}
}