Embedded Linux下Java Socket迅速判斷遠端網絡斷開 – JAVA編程語言程序開發技術文章

首先介紹一下我的平臺和應用環境。我使用的硬件平臺是友善之臂Micro2440,軟件平臺是Embedded Linux,kernel版本是2.6.32,使用的java語言。

可能大傢知道在使用Java Socket編程的時候經常要檢測網絡是不是完好連接的。比如Socket服務器檢測和客戶端的連接是否已經斷開。首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗並查看相關文檔,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連接。使用Socket的isconnected()方法檢測時,滯後是很大的,往往在20秒以上。這不利於系統的實時性。

然後想到是否可以通過OutputStream發送一段測試數據,如果發送失敗就表示遠端已經斷開連接,類似ping,但是這樣會影響到正常的輸出數據,遠端無法把正常數據和測試數據分開。發現有一個方法sendUrgentData,查看文檔後得知它會往輸出流發送一個字節的數據,隻要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個字節,而SO_OOBINLINE屬性默認情況下就是關閉的。

於是使用的代碼如下:
public boolean isConnected(){
        try{
            s.sendUrgentData(0xFF);
            return true;
        }catch(Exception e){
            return false;
        }

}

通過測試發現,系統可以迅速檢測到網絡的狀態!
 

發佈留言