我正在编写一个简单的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。
答案 0 :(得分:2)
算了。只需读写,并处理出现的异常。
目前你正在进行算命。即使您找到一种方法可以告诉您客户端连接现在是否处于活动状态,但在调用此方法和下一行代码之间可能会出现问题。
尝试检测资源是否可用的唯一方法是尝试以正常方式使用它。