Java socket中isClose()和isConnected() .
可以引起網(wǎng)絡(luò)連接關(guān)閉的情況有以下4種:
1.? 直接調(diào)用Socket類的close方法。
2.? 只要Socket類的InputStream和OutputStream有一個關(guān)閉,網(wǎng)絡(luò)連接自動關(guān)閉(必須通過調(diào)用InputStream和OutputStream的 close方法關(guān)閉流,才能使網(wǎng)絡(luò)自動關(guān)閉)。
3.? 在程序退出時網(wǎng)絡(luò)連接自動關(guān)閉。
4.? 將Socket對象設(shè)為null或未關(guān)閉最使用new Socket(…)建立新對象后,由JVM的垃圾回收器回收為Socket對象分配的內(nèi)存空間后自動關(guān)閉網(wǎng)絡(luò)連接。???
雖然這4種方法都可以達到同樣的目的,但一個健壯的網(wǎng)絡(luò)程序最好使用第1種或第2種方法關(guān)閉網(wǎng)絡(luò)連接。這是因為第3種和第4種方法一般并不會馬上關(guān)閉網(wǎng)絡(luò)連接,如果是這樣的話,對于某些應(yīng)用程序,將會遺留大量無用的網(wǎng)絡(luò)連接,這些網(wǎng)絡(luò)連接會占用大量的系統(tǒng)資源。
在Socket對象被關(guān)閉后,我們可以通過isClosed方法來判斷某個Socket對象是否處于關(guān)閉狀態(tài)。然而使用isClosed方法所返回的只是Socket對象的當前狀態(tài),也就是說,不管Socket對象是否曾經(jīng)連接成功過,只要處于關(guān)閉狀態(tài),isClosde就返回true。如果只是建立一個未連接的Socket對象,isClose也同樣返回true。如下面的代碼將輸出false。
Socket socket = new Socket(); System.out.println(socket.isClosed());除了isClose方法,Socket類還有一個isConnected方法來判斷Socket對象是否連接成功。看到這個名字,也許讀者會產(chǎn)生誤解。其實isConnected方法所判斷的并不是Socket對象的當前連接狀態(tài),而是Socket對象是否曾經(jīng)連接成功過,如果成功連接過,即使現(xiàn)在isClose返回true,isConnected仍然返回true。因此,要判斷當前的Socket對象是否處于連接狀態(tài),必須同時使用isClose和isConnected方法,即只有當isClose返回false,isConnected返回true的時候Socket對象才處于連接狀態(tài)。下面的代碼演示了上述Socket對象的各種狀態(tài)的產(chǎn)生過程。
package mysocket;import java.net.*;public class MyCloseConnection {public static void printState(Socket socket, String name){System.out.println(name + ".isClosed():" + socket.isClosed());System.out.println(name + ".isConnected():" + socket.isConnected());if (socket.isClosed() == false && socket.isConnected() == true)System.out.println(name + "處于連接狀態(tài)!");elseSystem.out.println(name + "處于非連接狀態(tài)!");System.out.println();}public static void main(String[] args) throws Exception{Socket socket1 = null, socket2 = null;socket1 = new Socket("www.ptpress.com.cn", 80);printState(socket1, "socket1");socket1.getOutputStream().close();printState(socket1, "socket1");socket2 = new Socket();printState(socket2, "socket2");socket2.close();printState(socket2, "socket2");} }?
運行上面的代碼后,將有如下的輸出結(jié)果:
?????? socket1.isClosed():false
socket1.isConnected():true
socket1處于連接狀態(tài)!
?
socket1.isClosed():true
socket1.isConnected():true
socket1處于非連接狀態(tài)!
?
socket2.isClosed():false
socket2.isConnected():false
socket2處于非連接狀態(tài)!
?
socket2.isClosed():true
socket2.isConnected():false
socket2處于非連接狀態(tài)!
從輸出結(jié)果可以看出,在socket1的OutputStream關(guān)閉后,socket1也自動關(guān)閉了。而在上面的代碼我們可以看出,對于一個并未連接到服務(wù)端的Socket對象socket2,它的isClosed方法為false,而要想讓socket2的isClosed方法返回true,必須使用socket2.close顯示地調(diào)用close方法。
?
總結(jié)
以上是生活随笔為你收集整理的Java socket中isClose()和isConnected() .的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: InputStream与DataInpu
- 下一篇: 如何判断Socket连接失效