說明'的ServerSocket.accept()' 循環,不SocketTimeoutException(Java)的(替代解決方案)
我重新審視我曾經教過自己的Java項目。
在這個項目中,我希望能夠阻止服務器接受新客戶端,然後在退出JVM之前執行一些「清理」操作。
在該項目中我用下面的風格爲客戶接受/手柄循環:
//Exit loop by changing running to false and waiting up to 2 seconds
ServerSocket serverSocket = new ServerSocket(123);
serverSocket.setSoTimeout(2000);
Socket client;
while (running){ // 'running' is a private static boolean
try{
client = serverSocket.accept();
createComms(client); //Handles Connection in New Thread
} catch (IOException ex){
//Do Nothing
}
}
在這種方法中SocketTimeoutException將每2秒拋出,如果有連接任何客戶端,和我不除非有必要,否則就像依靠正常操作的例外。
我一直在用下面的風格實驗爲了儘量依靠例外正常運行:
//Exit loop by calling serverSocket.close()
ServerSocket serverSocket = new ServerSocket(123);
Socket client;
try{
while ((client = serverSocket.accept()) != null){
createComms(client); //Handles Connection in New Thread
}
} catch (IOException ex){
//Do Nothing
}
在這種情況下,我的意圖是,一個異常將只當我打電話serverSocket.close拋出()或者是出了什麼問題。
問題
是否有這兩種方法的任何顯著的差異,或者是它們都可行的解決方案?
我完全自學成功,所以我不知道我是否無緣無故地重新發明了車輪,或者我已經想出了一些好東西。
我一直在潛伏着一段時間,這是我第一次無法找到我需要的東西。
請隨時提出完全不同的方法= 3
「我不喜歡依賴正常操作的例外,除非有必要」OMG另一個。這是必要的。 'setSoTimeout()'機制就是爲了這個目的而提供的,'SocketTimeoutException'是它的接口的一部分。不要讓任意編程美學妨礙實現正確的代碼。以什麼方式強制拋出'IOException:socket closed'比捕獲'SocketTimeoutException'更好? – EJP 2014-10-30 22:43:00
我不確定在這種情況下是否有必要,這就是我問的原因。我最初的想法是拋出一個異常會更好,可能每2秒拋一次。 – 2014-10-31 08:03:32