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

时间:2015-11-18 21:07:17

标签: java android tcpclient tcp-ip

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

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

当我在手机上关闭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");
    }
}

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

socket.setSoTimeout(timeout)

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

答案 1 :(得分:1)

readLine()返回null时,您应该停止阅读。将永远不会有更多数据。

如果read()为任何X返回-1或readXXX()抛出EOFException,则同样适用。