2017-06-04 67 views
2

我正在写一个简单的tcp流SMTP服务器。我编写了以下代码来检查客户端连接是否仍然可用。只需查看一个字节即可查看套接字输入流是否正常工作。但是,当我将in.mark(x)预读限制设置为1时,它会在我第二次尝试发送标题时显示错误。当它设置为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

忘掉它吧。只要阅读和写作,并处理例外,因为它们出现。目前你从事算命。即使你找到一种方法来告诉你客户端连接是否已经存在,它可能会在调用这个方法和下一行代码之间停下来。尝试检测资源是否可用的唯一方法是尝试以正常方式使用它。 – EJP

+0

@EJP我喜欢你的说法,算命。其实我会接受你的答案,如果它是一个。非常感谢您的洞察力。 – viz

+0

确定这里是作为一个答案。 – EJP

回答

2

忘记它。只要阅读和写作,并处理例外,因为它们出现。

目前你从事算命。即使你找到一种方法来告诉你客户端连接是否已经存在,它可能会在调用这个方法和下一行代码之间停下来。

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

相关问题