检查客户端是否关闭连接时,reset()出错

时间:2017-06-04 06:56:51

标签: java tcp inputstream serversocket

我正在编写一个简单的tcp流SMTP服务器。我编写了以下代码来检查客户端连接是否仍然可用。只需查看一个字节即可查看套接字输入流是否正常工作。但是当我将in.mark(x)预读限制设置为1时,当我第二次尝试发送Header时会显示错误。当它设置为2时,它似乎根本没有任何问题。这是为什么?

// check if client disconnected
try {
    in.mark(1); // 1 char read ahead limit
    if (in.read() == -1) {
        System.out.println("CONNECTION CLOSED BY CLIENT!");
        return; // end of thread
    } else {
        in.reset();
    }
} catch (Exception e) {
    e.printStackTrace();
    throw new RuntimeException();
}

我得到的错误是:

java.io.IOException: Mark invalid
    at java.io.BufferedReader.reset(BufferedReader.java:512)
    at smtp.server.SocketThread.run(SocketThread.java:59)

整个代码位于my github

1 个答案:

答案 0 :(得分:2)

算了。只需读写,并处理出现的异常。

目前你正在进行算命。即使您找到一种方法可以告诉您客户端连接现在是否处于活动状态,但在调用此方法和下一行代码之间可能会出现问题。

尝试检测资源是否可用的唯一方法是尝试以正常方式使用它。