2008-08-22 160 views
3

我有我的服务器我连接到使用Java类和Socket接口,即在一个监听端口将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()方法尝试,但它似乎不知道连接关闭。

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

有什么建议吗?

谢谢全部

+0

isConnected()方法告诉你是否曾经连接过这个Socket。它没有告诉你有关连接的状态。 – EJP 2014-02-22 22:41:56

回答

0

设置短暂超时?

isOutputShutdown()没有得到你想要的东西吗?

你总是可以建立一个SocketWatcher类,在自己的Thread旋转起来,并反复尝试空字符串写入Socket直到引起了SocketClosedException

+0

不,isOutputShutdown()不会给他他想要的,也不会短暂超时或尝试获取一个甚至不存在的SocketClosedException。您正在将Socket的状态与连接状态混淆。 -1 – EJP 2014-02-22 22:40:38

-2

将另一个线程设置为从套接字读取。它会阻塞,直到套接字关闭,然后会抛出异常。抓住该异常立即检测到关闭。

+0

TCP连接可能无法通过读取检测到失败。 – EJP 2014-02-22 22:44:41

0

检测TCP断开连接的唯一可靠方法是写入,最终会导致'连接重置'IOException。但是,由于缓冲,它不会在断开连接后的第一次写入时发生,但会在后续写入时发生。你无法对此做任何事情。

相关问题