java - 我可以在客户端关闭套接字而不导致服务器端出现 EOFException 吗?

标签 java sockets eofexception

我刚刚开始使用套接字,而且我不是一个非常有经验的程序员。我想通过使用断开连接按钮来关闭客户端的连接。断开连接按钮将执行以下代码:

 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/

相关文章:

java.io.EOFException while writing and read from a servlet

java - 如何在UML中表示一个类在发布spring事件时调用另一个类的方法

java - 如何为手机中安装的 Whatsapp、Facebook 或其他应用程序创建共享按钮

java - Spring Boot启动器安全性未进行身份验证

java - 使用 Socket.IO (websocket) 和 4G 在两个 Android 之间进行实时数据传输

java - 使用 Selenium webdriver 的模态页面自动化

sockets - 如何解释sendto Unix套接字消息?

c - TCP_INFO tcpi_lost 和 tcpi_retrans 之间的区别

java - 一种更好的方法来处理文件上传中在套接字上读取的意外 EOF?