将Java Socket配置为在断开连接时快速失败?
Posted
技术标签:
【中文标题】将Java Socket配置为在断开连接时快速失败?【英文标题】:Configure a Java Socket to fail-fast on disconnect? 【发布时间】:2010-09-06 13:38:00 【问题描述】:我的服务器上有一个监听端口,我使用 Java 类和Socket
接口连接到该端口,即
Socket mySocket = new Socket(host,port);
然后我抓住一个OutputStream
,在自动刷新模式下用PrintWriter
装饰,我在笑——除非监听端口关闭。然后我得到了
tcp4 0 0 *.9999 *.* LISTEN
tcp 0 0 127.0.0.1.45737 127.0.0.1.9999 CLOSE_WAIT
而且我似乎无法检测到程序中的问题 - 我尝试在套接字上使用 isConnected()
方法,但它似乎不知道连接已关闭。
我想在下次尝试写入 Socket 时注意问题,以便我可以尝试重新连接并报告问题。
有什么建议吗?
谢谢大家
【问题讨论】:
isConnected() 方法告诉你是否曾经连接过这个 Socket。它不会告诉您连接的状态。 【参考方案1】:在 TCP 中检测断开连接的唯一可靠方法是写入它,这最终会导致“连接重置”IOException。但是,由于缓冲,它不会在断开连接后的第一次写入时发生,而是在随后的写入时发生。你对此无能为力。
【讨论】:
【参考方案2】:设置一个不同的线程来从套接字读取。它将阻塞直到套接字关闭,然后将抛出异常。捕获该异常以立即检测关闭。
【讨论】:
TCP 连接可能以读取无法检测到的方式失败。【参考方案3】:设置一个短暂的超时时间?
isOutputShutdown()
没有得到你想要的吗?
您始终可以构建一个 SocketWatcher
类,该类在其自己的 Thread
中旋转并反复尝试将空字符串写入 Socket
,直到引发 SocketClosedException
。
【讨论】:
不,isOutputShutdown() 没有给他他想要的东西,也没有短暂的超时或尝试获取 SocketClosedException,它甚至不存在。您将 Socket 的状态与连接的状态混淆了。 -1以上是关于将Java Socket配置为在断开连接时快速失败?的主要内容,如果未能解决你的问题,请参考以下文章