1. 程式人生 > >Java socket中isClose()和isConnected()

Java socket中isClose()和isConnected()

可以引起網路連線關閉的情況有以下4種:

1.  直接呼叫Socket類的close方法。

2.  只要Socket類的InputStreamOutputStream有一個關閉,網路連線自動關閉(必須通過呼叫InputStreamOutputStream 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返回trueisConnected仍然返回true。因此,要判斷當前的Socket物件是否處於連線狀態,必須同時使用isCloseisConnected方法,即只有當isClose返回falseisConnected返回true的時候Socket物件才處於連線狀態。下面的程式碼演示了上述Socket物件的各種狀態的產生過程。

package mysocket;

import java.net.*;

publicclass MyCloseConnection
{
    
publicstaticvoid 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 
+"處於連線狀態!");
        
else
            System.out.println(name 
+"處於非連線狀態!");
        System.out.println();
    }

    
publicstaticvoid 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處於非連線狀態!

從輸出結果可以看出,在socket1OutputStream關閉後,socket1也自動關閉了。而在上面的程式碼我們可以看出,對於一個並未連線到服務端的Socket物件socket2,它的isClosed方法為false,而要想讓socket2isClosed方法返回true,必須使用socket2.close顯示地呼叫close方法。