打開了連接服務器的一個Socket后,隔了一段時間沒用,Socket就會自動關閉(為什么?),這時候如果獲取該Socket的OutputStream,并往里面寫東西,在flush的時候就會出現:
java.net.SocketException: Software caused connection abort: socket write error
的異常。因此,如果隔了一段時間沒有使用某個Socket,需要重新使用它的時候,就要先判斷它究竟是否還在連接當中,一共嘗試了Socket的三個方法:
1、isClosed()
2、isOutputShutdown()
3、isConnected()
發現前兩個都沒用,即使已經斷開了,返回的還是false,只有第三個可以解決問題。
具體原因未知。
2007-4-19更新:
第三個也解決不了問題,還會出現同樣的異常,目前的解決方法是catch SocketException,不管socket的狀態如何,都把它關閉了重新再連,但是SocketException的種類有很多,不一定是因為Socket已關閉,所以這種方法有點粗魯,但找不到更好的方法。
評論
最近在開發中遇到一個問題,就是如何判斷遠端服務器是否已經斷開連接,如果斷開那么需要重新連接。
首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗并查看相關文檔,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連接。
然后想到是否可以通過OutputStream發送一段測試數據,如果發送失敗就表示遠端已經斷開連接,類似ping,但是這樣會影響到正常的輸出數據,遠端無法把正常數據和測試數據分開。
最后又回到socket類,發現有一個方法sendUrgentData,查看文檔后得知它會往輸出流發送一個字節的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個字節,而SO_OOBINLINE屬性默認情況下就是關閉的,太好了,正是我需要的!
于是,下面一段代碼就可以判斷遠端是否斷開了連接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
} 回復 更多評論
首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗并查看相關文檔,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連接。
然后想到是否可以通過OutputStream發送一段測試數據,如果發送失敗就表示遠端已經斷開連接,類似ping,但是這樣會影響到正常的輸出數據,遠端無法把正常數據和測試數據分開。
最后又回到socket類,發現有一個方法sendUrgentData,查看文檔后得知它會往輸出流發送一個字節的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個字節,而SO_OOBINLINE屬性默認情況下就是關閉的,太好了,正是我需要的!
于是,下面一段代碼就可以判斷遠端是否斷開了連接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
} 回復 更多評論
只有注冊用戶登錄后才能發表評論。 | ||
![]() |
||
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關文章:
|
||