Posted on 2013-08-15 20:09
云自無心水自閑 閱讀(2690)
評論(0) 編輯 收藏
最近在開發(fā)中遇到一個問題,就是如何判斷遠(yuǎn)端服務(wù)器是否已經(jīng)斷開連接,如果斷開那么需要重新連接。 首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經(jīng)過試驗并查看相關(guān)文檔,這些方法都是本地端的狀態(tài),無法判斷遠(yuǎn)端是否已經(jīng)斷開連接。 然后想到是否可以通過OutputStream發(fā)送一段測試數(shù)據(jù),如果發(fā)送失敗就表示遠(yuǎn)端已經(jīng)斷開連接,類似ping,但是這樣會影響到正常的輸出數(shù)據(jù),遠(yuǎn)端無法把正常數(shù)據(jù)和測試數(shù)據(jù)分開。 最后又回到socket類,發(fā)現(xiàn)有一個方法sendUrgentData,查看文檔后得知它會往輸出流發(fā)送一個字節(jié)的數(shù)據(jù),只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個字節(jié),而SO_OOBINLINE屬性默認(rèn)情況下就是關(guān)閉的,太好了,正是我需要的! 于是,下面一段代碼就可以判斷遠(yuǎn)端是否斷開了連接: Java代碼

- try{
- socket.sendUrgentData(0xFF);
- }catch(Exception ex){
- reconnect();
- }