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種方法關閉網絡連接。這是因為第3種和第4種方法一般并不會馬上關閉網絡連接,如果是這樣的話,對于某些應用程序,將會遺留大量無用的網絡連接,這些網絡連接會占用大量的系統資源。
在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;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 + "處于連接狀態!");elseSystem.out.println(name + "處于非連接狀態!");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");} }?
運行上面的代碼后,將有如下的輸出結果:
?????? 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方法。
?
總結
以上是生活随笔為你收集整理的Java socket中isClose()和isConnected() .的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: InputStream与DataInpu
- 下一篇: Java:用POI读写Excel