我使用Java Knock Knock教程创建客户端 - 服务器连接,但我无法弄清楚如何检查套接字是否仍然打开。
简化代码:
try {
while ((clientMessage = inFromClient.readLine()) != null) {
//do stuff
} catch (IOException e) {
//client disconnected
e.printStackTrace();
}
}
这很好用,但是我注意到当客户端基于Linux时,如果客户端被强制关闭,则不会引发异常。我尝试了其他人发布的一些建议,但无法正常工作。我试图实现一个循环来检查自上次收到消息以来它已经有多长时间但它不起作用,循环必须在上面代码的循环中,并且循环仅在从以下代码接收到新消息时执行客户端。我很困惑,但我不明白如何实现任何检查方法。
如果我把方法用于检查上述循环之外的不活动,那么它永远不会被调用,因为套接字循环是不确定的(除非套接字被关闭)。
答案 0 :(得分:3)
只需使用Socket.setSoTimeout()
设置读取超时。将其设置为高于预期的请求间隔,比如加倍。如果它过期,您将获得SocketTimeoutException
:关闭套接字。
与某些评论相反,isConnected()
,isBound()
,isClosed(),
等对此没有用处。它们会告诉您你连接,绑定,关闭等套接字。不是关于连接的状态。