能大家知道在使用Java Socket編程的時(shí)候經(jīng)常要檢測(cè)網(wǎng)絡(luò)是不是完好連接的竟秫。比如Socket服務(wù)器檢測(cè)和客戶(hù)端的連接是否已經(jīng)斷開(kāi)。
首先想到socket類(lèi)的方法isClosed()失尖、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等砾肺,但經(jīng)過(guò)試驗(yàn)并查看相關(guān)文檔,這些方法都是本地端的狀態(tài)防嗡,無(wú)法判斷遠(yuǎn)端是否已經(jīng)斷開(kāi)連接变汪。
使用Socket的isconnected()方法檢測(cè)時(shí),滯后是很大的蚁趁,往往在20秒以上裙盾。這不利于系統(tǒng)的實(shí)時(shí)性。
然后想到是否可以通過(guò)OutputStream發(fā)送一段測(cè)試數(shù)據(jù)他嫡,如果發(fā)送失敗就表示遠(yuǎn)端已經(jīng)斷開(kāi)連接番官,類(lèi)似ping,但是這樣會(huì)影響到正常的輸出數(shù)據(jù)钢属,遠(yuǎn)端無(wú)法把正常數(shù)據(jù)和測(cè)試數(shù)據(jù)分開(kāi)徘熔。
發(fā)現(xiàn)有一個(gè)方法sendUrgentData,查看文檔后得知它會(huì)往輸出流發(fā)送一個(gè)字節(jié)的數(shù)據(jù)淆党,只要對(duì)方Socket的SO_OOBINLINE屬性沒(méi)有打開(kāi)酷师,就會(huì)自動(dòng)舍棄這個(gè)字節(jié),而SO_OOBINLINE屬性默認(rèn)情況下就是關(guān)閉的染乌。
于是使用的代碼如下:
public boolean isConnected(){
try{
s.sendUrgentData(0xFF);
return true;
}catch(Exception e){
return false;
}
}
通過(guò)測(cè)試發(fā)現(xiàn)山孔,系統(tǒng)可以迅速檢測(cè)到網(wǎng)絡(luò)的狀態(tài)!