程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java網絡編程從入門到精通(27):關閉服務端連接

Java網絡編程從入門到精通(27):關閉服務端連接

編輯:關於JAVA

在客戶端和服務端的數據交互完成後,一般需要關閉網絡連接。對於服務端來說,需要關閉Socket和ServerSocket。

在關閉Socket後,客戶端並不會馬上感知自已的Socket已經關閉,也就是說,在服務端的Socket關閉後,客戶端的Socket的isClosed和isConnected方法仍然會分別得到false和true。但對已關閉的Socket的輸入輸出流進行操作會拋出一個SocketException異常。

在關閉服務端的ServerSocket後,ServerSocket對象所綁定的端口被釋放。這時客戶端將無法連接服務端程序。下面的代碼演示了在服務端關閉Socket後,客戶端是所何反應的。

package server;
import java.net.*;
class Client
{
     public static void main(String[] args) throws Exception
     {
         Socket socket = new Socket("127.0.0.1", 1234);
         Thread.sleep(1000);
         // socket.getOutputStream().write(1);
         System.out.println("read() = " + socket.getInputStream().read());
         System.out.println("isConnected() = " + socket.isConnected());
         System.out.println("isClosed() = " + socket.isClosed());
     }
}
public class CloseSocket
{
     public static void main(String[] args) throws Exception
     {
         ServerSocket serverSocket = new ServerSocket(1234);
         while (true)
         {
             Socket socket = serverSocket.accept();
             socket.close();
         }
     }
}

測試

執行下面的命令

java server.CloseSocket
java server.Client

運行結果

read() = -1
isConnected() = true
isClosed() = false

從上面的運行結果可以看出例程Client並未拋出SocketException異常。而在012行的read方法返回了-1。如果將socket.close去掉,客戶端的read方法將處於阻塞狀態。這是因為Java在發現無法從服務端的Socket得到數據後,就通過read方法返回了-1。如果將011行的注釋去掉,Client就會拋出一個SocketException異常。大家可以試試,並socket.close行改成serverSocket.close後,客戶端就會拋出連接異常:

Exception in thread "main" java.net.SocketException: Connection reset
     at java.net.SocketInputStream.read(SocketInputStream.java:168)
     at java.net.SocketInputStream.read(SocketInputStream.java:182)
     at chapter5.Client.main(CloseSocket.java:12)

顯式地調用close方法關閉ServerSocket並不是必須的,在程序退出時將自動關閉ServerSocket。但通過close方法關閉ServerSocket,可以使其他的ServerSocket對象綁定該端口。可以使用ServerSocket類的isClosed和isBound方法判斷ServerSocket是否處於活動狀態,如下面的代碼所示:

ServerSocket serverSocket = new ServerSocket(1234);
if (serverSocket.isBound() == true && serverSocket.isClosed() == false)
     System.out.println("serverSocket處於活動狀態!");
else
     System.out.println("serverSocket處於非活動狀態!");

上面代碼所示的“非活動狀態”可能是serverSocket對象已經關閉,也可能是serverSocket對象是使用ServerSocket類的默認構造方法創建的,而且未調用bind方法綁定端口。在這裡要注意的是isBound方法返回true並不意味著serverSocket對象處於活動狀態,調用close方法並不會將綁定狀態置為false。這一點和Socket類的isConnected方法類似。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved