java我可以关闭客户端的socket而不引起服务器端的EOFEException吗?
我刚刚开始使用Socket,我不是一个经验丰富的程序员。我想用断开按钮关闭客户端的连接。断开按钮将执行以下代码:
private void closeConnection() {
if (socket != null) {
jLabelStatus.setText("Status: closing connection");
try {
socket.close();
} catch (IOException ex) {
Logger.getLogger(DatabaseClient.class.getName()).log(Level.SEVERE, null, ex);
} finally {
socket = null;
}
}
}
然而,我不太确定如何确保服务器端不会出现异常。我的run()
方法(它覆盖Runnable run()
方法)在尝试读取消息时捕获异常时执行以下代码作为finally block的一部分:
try {
threadSays("Lost connection to client.");
socket.close();
} catch (IOException ex) {
Logger.getLogger(ClientHandlerThread.class.getName()).log(Level.SEVERE, null, ex);
}
当我按下断开连接按钮时,服务器会抛出一个严重的错误:null java。伊奥。EOFEException
我知道这可能是因为。。。我试图在这里做socket.close()
,尽管这是在客户端完成的。那么,确保不发生例外的最佳方式是什么呢?如果socket.close()
发生在客户端,是否不需要socket.close()
方法?我如何检查它是否发生过
编辑:堆栈跟踪
SEVERE: null
java.io.EOFException
at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3062)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1561)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
at sqlitechinookcw.ClientHandlerThread.run(ClientHandlerThread.java:64)
at java.base/java.lang.Thread.run(Thread.java:830)
# 1 楼答案
在这种情况下,预期会出现异常行为。服务器的
run()
方法正在调用ObjectInputStream.readObject()
,它无法返回部分对象。断开连接将是一个致命错误。让它发生,然后catch
异常,这样您的服务器就可以close()
它的连接端并退出run()