将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配置为在断开连接时快速失败?的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 不会在断开连接时向房间发送消息

当客户端除了快速连接-断开之外啥都不做时,命名管道会失败

JAVA 判断Socket 远程端是否断开连接

刷新时Socket.io断开连接?

socket.io 在空闲时断开客户端的连接

如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?