Socket.close()如何失败(没有抛出异常)?

时间:2011-06-20 13:33:23

标签: java sockets

在多线程应用程序中,我有一个线程从套接字连接读取数据,直到发生读取超时。然后它设置一个关闭标志,向自己发送一个中断信号并在退出之前进行一些清理。作为清理的一部分,它在客户端套接字上调用close()

我在调试器中验证了对close()的调用确实发生了。此外,它不会抛出异常。仍然,套接字报告正在连接。我知道,因为还有另一个线程wait让它断开连接。此线程稍后应重新连接,但不会因为调用isConnected()不断返回true

这会导致无法读取数据,也不会再次清除和重新连接套接字的情况。

如果调用Socket.close(),是否有任何方法可以无声地失败?

5 个答案:

答案 0 :(得分:6)

isConnected并不意味着“已连接到服务器”,但“曾连接过”。如果您想知道套接字是否已关闭,请使用isClosed

答案 1 :(得分:2)

isConnected()并不代表你的想法。如果我记得正确的话,我会在你连接后保持真实。

修改:来自documentation

true if the socket successfuly connected to a server

这意味着当你断开连接时它不会变错。

Edit2:我看到其他一些答案建议您检查isClosed。请注意,isClosed仅在您调用close()时才返回true。如果另一方关闭连接,它将不会自动开始返回true。

答案 2 :(得分:1)

结合artbristol的评论,Kaj's和dawce的答案以及我所做的一些其他诊断,完整的答案是:

  1. close()可能没有失败。您无法使用isConnected()检查套接字的当前连接状态,这只会告诉您连接是否成功。致电isClosed()会告诉您之前是否已经呼叫过close()

  2. 在调试过程中,数据包嗅探器可以在您逐步执行代码时向您显示线路上发生的事情。对于您的示例,这应该表明连接确实在网络层上关闭,即。例如,你应该看到FIN和相应的ACK数据包,然后不再有。

  3. 如果您确定套接字已关闭,则无法重新连接或重新绑定套接字。相反,你必须创建一个新的套接字。

答案 3 :(得分:0)

我不知道有任何这样的行为。也许第二个帖子会有更多的运气叫isClosed

答案 4 :(得分:0)

任何人都来到这里,想知道如何检查Socket是否已关闭。

socket.isConnected() && socket.isClosed()