如何注意到客户端与服务器断开连接 - JAVA

How to notice that client disconnected from server - JAVA

我知道过去有过类似的问题,我研究了其中的大部分问题,但无法使我的代码正常工作。

我有一个用 Java 编写的 TCPIP 服务器和一个客户端 Android 应用程序。

当我关闭 phone 上的 WLAN 时,我显然没有连接到我的服务器,但服务器没有注意到这一点。

我在服务器上的读取方式

try {
    bufferSender = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    //this while it's like a listener for messages
    String message = null;
    while (running) {
        try {
            message = in.readLine();
            if (message == null)
                System.out.println(this.user.getUsername() + " left the room.");
        } catch (IOException e) {
            System.out.println("Error reading message: " + e.getMessage());
            running = false;
            managerDelegate.userDisconnected(this);
        }

        if (message != null && managerDelegate != null) {
            user.setMessage(message);
            System.out.println("message:" + message);

            // notify message received action
            managerDelegate.messageReceived(user);
        }
    }

} catch (Exception e) {
    System.out.println("S: Error");
    e.printStackTrace();
}

我了解到在尝试读取来自客户端的消息时应该会出错。但是我没有收到任何错误。

所以我尝试每隔 X 秒从服务器向客户端发送一条消息。 我是这样发送的:

public void sendMessage(String message) {
    if (bufferSender != null && !bufferSender.checkError()) {
        bufferSender.println(message);
        bufferSender.flush();
    } else {
        System.out.println("ERROR");
    }
}

但同样,没有任何反应。即使客户端没有连接到互联网,我也不会通过向客户端发送消息得到任何错误。

我做错了什么?

您应该在套接字上设置超时。默认情况下,如果连接没有机会告诉另一方它正在关闭连接,它们将永远等待。

socket.setSoTimeout(timeout)

您应该在连接的客户端和服务器端都设置超时。

readLine() returns 为 null 时,您应该 停止阅读。 将不再有任何数据。

对于任何 X,如果 read() returns -1 或 readXXX() 抛出 EOFException,同样适用。