有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在这种情况下,预期会出现异常行为。服务器的run()方法正在调用ObjectInputStream.readObject(),它无法返回部分对象。断开连接将是一个致命错误。让它发生,然后catch异常,这样您的服务器就可以close()它的连接端并退出run()