如何知道Java Socket已经死了

时间:2010-01-13 09:37:54

标签: java sockets exception-handling

我在客户端应用程序中使用Java Socket对象。我需要知道服务器的线路何时断开,或者是否有任何事件导致套接字死机。

我看到两种方法:

  • 在写入或读取套接字时捕获SocketException,考虑到这些异常会杀死套接字
  • 捕获这些异常时,检查Socket.isClosed()方法以确定它是否杀死了套接字

这些方法中的任何一种都能保证我知道套接字何时死机并且不会再次工作,即使线路上的临时问题已解决了吗? 除了在套接字上的操作期间抛出的(套接字)异常,我们可以暗示套接字已经死了吗?

有没有更好的方法来了解这一点?

4 个答案:

答案 0 :(得分:2)

至少:

  1. 收到异常并不意味着套接字总是死的,来自Socket.setSoTimeout() javadoc:

      

    如果超时[在读取时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。

  2. 套接字的关闭标志似乎只在调用Socket.close()方法时设置,所以我不会依赖它。

答案 1 :(得分:1)

这通常是通过超时完成的。如果您不信任另一方(如每次),这是强制性的。如果没有超时,攻击者可以通过打开连接而无需发送任何内容来轻松地执行您的应用程序。一旦达到系统的套接字限制,应用程序甚至可能会崩溃......

答案 2 :(得分:0)

“Dead Socket”可被视为异常状态。这只是一个错误的行为。所以我认为你不能有效地处理这种情况。

答案 3 :(得分:0)

由于套接字之间没有像keep-alive这样的东西,你将会知道连接在下次尝试写入此套接字时才会被破坏。