Java socket中isClose()和isConnected()
可以引起網路連線關閉的情況有以下4種:
1. 直接呼叫Socket類的close方法。
2. 只要Socket類的InputStream和OutputStream有一個關閉,網路連線自動關閉(必須通過呼叫InputStream和OutputStream的 close方法關閉流,才能使網路可愛接自動關閉)。
3. 在程式退出時網路連線自動關閉。
4. 將Socket物件設為null或未關閉最使用new Socket(…)建立新物件後,由JVM的垃圾回收器回收為Socket物件分配的記憶體空間後自動關閉網路連線。
雖然這4種方法都可以達到同樣的目的,但一個健壯的網路程式最好使用第1種或第2種方法關閉網路連線。這是因為第
在Socket物件被關閉後,我們可以通過isClosed方法來判斷某個Socket物件是否處於關閉狀態。然而使用isClosed方法所返回的只是Socket物件的當前狀態,也就是說,不管Socket物件是否曾經連線成功過,只要處於關閉狀態,isClosde就返回true。如果只是建立一個未連線的Socket物件,isClose也同樣返回true。如下面的程式碼將輸出false。
Socket socket =new Socket(); System.out.println(socket.isClosed()); |
除了isClose方法,Socket類還有一個isConnected方法來判斷Socket物件是否連線成功。看到這個名字,也許讀者會產生誤解。其實isConnected方法所判斷的並不是Socket物件的當前連線狀態,而是Socket物件是否曾經連線成功過,如果成功連線過,即使現在isClose返回true,isConnected仍然返回true。因此,要判斷當前的Socket物件是否處於連線狀態,必須同時使用isClose和isConnected方法,即只有當isClose返回false,isConnected返回true的時候Socket物件才處於連線狀態。下面的程式碼演示了上述Socket物件的各種狀態的產生過程。
package mysocket; |
執行上面的程式碼後,將有如下的輸出結果:
socket1.isClosed():false
socket1.isConnected():true
socket1處於連線狀態!
socket1.isClosed():true
socket1.isConnected():true
socket1處於非連線狀態!
socket2.isClosed():false
socket2.isConnected():false
socket2處於非連線狀態!
socket2.isClosed():true
socket2.isConnected():false
socket2處於非連線狀態!
從輸出結果可以看出,在socket1的OutputStream關閉後,socket1也自動關閉了。而在上面的程式碼我們可以看出,對於一個並未連線到服務端的Socket物件socket2,它的isClosed方法為false,而要想讓socket2的isClosed方法返回true,必須使用socket2.close顯示地呼叫close方法。