我刚刚开始使用套接字,而且我不是一个非常有经验的程序员。我想通过使用断开连接按钮来关闭客户端的连接。断开连接按钮将执行以下代码:
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);
}
此时,如果我按下断开连接按钮,服务器会抛出 SEVERE: null java.io.EOFException。
我知道这可能是因为...我正在尝试做 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)
最佳答案
在这种情况下,异常是预期的行为。您的服务器的 run()
方法正在调用 ObjectInputStream.readObject()
,该方法无法返回部分对象。断开连接将是一个 fatal error 。让它发生,然后捕获
异常,以便您的服务器可以close()
其连接端并从run()
退出。
关于java - 我可以在客户端关闭套接字而不导致服务器端出现 EOFException 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60878766/