關閉服務端串連

來源:互聯網
上載者:User

        在用戶端和服務端的資料互動完成後,一般需要關閉網路連接。對於服務端來說,需要關閉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.CloseSocketjava server.Client

        運行結果:

read() = -1isConnected() = trueisClosed() = 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方法類似。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.