【问题标题】:how to know a Java Socket is dead如何知道 Java Socket 已死
【发布时间】:2011-01-04 13:37:03
【问题描述】:
我在客户端应用程序中使用 Java Socket 对象。我需要知道到服务器的线路何时断开,或者是否有任何事件导致套接字死机。
我看到了两种方法:
- 在写入或读取套接字时捕获 SocketException,考虑到这些异常会杀死套接字
- 捕获这些异常时,检查 Socket.isClosed() 方法以了解它是否杀死了套接字
这些方法中是否有任何一种方法可以保证我会知道套接字何时失效并且不会再次工作,即使线路上的临时问题得到了解决?
我们可以排除在套接字操作期间抛出的 (Socket)Exception 以暗示套接字已死吗?
有没有更好的方法知道这一点?
【问题讨论】:
标签:
java
sockets
exception-handling
【解决方案1】:
至少:
-
收到异常并不意味着套接字总是死的,来自Socket.setSoTimeout()javadoc:
如果超时到期 [例如在读取时,会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。
-
socket的关闭标志似乎只有在调用Socket.close()方法时才会设置,所以我不会依赖它。
【解决方案2】:
这通常通过超时来完成。如果您不信任对方(例如每次),这是强制性的。在没有超时的情况下,攻击者可以通过打开连接轻松地对您的应用程序进行 DoS,而无需发送任何内容。一旦达到系统的套接字限制,应用程序甚至可能崩溃......
【解决方案3】:
“Dead Socket”可视为异常状态。这只是一种错误的行为。所以我认为你不能有效地处理这种情况。
【解决方案4】:
由于套接字之间没有保持活动状态,因此您将知道连接已断开,直到下次您尝试写入此套接字时。