2008-08-22 161 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。但是,由於緩衝,它不會在斷開連接後的第一次寫入時發生,但會在後續寫入時發生。你無法對此做任何事情。

相關問題