在多线程应用程序中,我有一个线程从套接字连接读取数据,直到发生读取超时。然后它设置一个关闭标志,向自己发送一个中断信号并在退出之前进行一些清理。作为清理的一部分,它在客户端套接字上调用close()
。
我在调试器中验证了对close()
的调用确实发生了。此外,它不会抛出异常。仍然,套接字报告正在连接。我知道,因为还有另一个线程wait
让它断开连接。此线程稍后应重新连接,但不会因为调用isConnected()
不断返回true
。
这会导致无法读取数据,也不会再次清除和重新连接套接字的情况。
如果调用Socket.close()
,是否有任何方法可以无声地失败?
答案 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的答案以及我所做的一些其他诊断,完整的答案是:
close()
可能没有失败。您无法使用isConnected()
检查套接字的当前连接状态,这只会告诉您连接是否成功。致电isClosed()
会告诉您之前是否已经呼叫过close()
。
在调试过程中,数据包嗅探器可以在您逐步执行代码时向您显示线路上发生的事情。对于您的示例,这应该表明连接确实在网络层上关闭,即。例如,你应该看到FIN和相应的ACK数据包,然后不再有。
如果您确定套接字已关闭,则无法重新连接或重新绑定套接字。相反,你必须创建一个新的套接字。
答案 3 :(得分:0)
我不知道有任何这样的行为。也许第二个帖子会有更多的运气叫isClosed
?
答案 4 :(得分:0)
任何人都来到这里,想知道如何检查Socket
是否已关闭。
socket.isConnected() && socket.isClosed()