配置Java Socket以在断开连接时快速失败?

4

我在我的服务器上有一个监听端口,我正在使用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()方法,但它似乎不知道连接已关闭。

我希望在下次尝试写入套接字时能够意识到问题,以便我可以尝试重新连接并报告问题。

请问有什么建议吗?

谢谢大家


isConnected() 方法告诉你是否曾经连接过此 Socket,但它并不告诉你连接的状态。 - user207421
3个回答

1

设置短暂的超时时间?

isOutputShutdown()不能满足您的需求吗?

您可以构建一个SocketWatcher类,它在自己的Thread中启动并重复尝试向Socket写入空字符串,直到引发SocketClosedException为止。


不,isOutputShutdown()并不能给他想要的东西,短暂的超时或尝试获取一个甚至不存在的SocketClosedException也不行。你把Socket的状态和连接的状态混淆了。-1 - user207421

0
TCP 中检测断开连接的唯一可靠方式是写入它,这最终会导致“连接重置”的 IOException。但是,由于缓冲,它不会在断开连接后的第一次写入时发生,而是在随后的写入时发生。你无法做任何事情来避免这种情况。

-2

将不同的线程设置为从套接字读取。它将一直阻塞,直到套接字关闭,然后会抛出一个异常。捕获该异常以立即检测到关闭。


TCP连接有可能以无法被读取的方式失败,这种情况是可以发生的。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接