隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

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

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:Java網絡編程從入門到精通(26):在服務端接收和發送數據

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

          在關閉Socket后,客戶端并不會馬上感知自已的Socket已經關閉,也就是說,在服務端的Socket關閉后,客戶端的SocketisClosedisConnected方法仍然會分別得到falsetrue。但對已關閉的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類的isClosedisBound方法判斷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方法類似。

           下一篇:Java網絡編程從入門到精通(28):獲取ServerSocket信息的方法及FTP原理






          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-08-04 09:26 銀河使者 閱讀(3711) 評論(3)  編輯  收藏 所屬分類: java 原創網絡編程

          評論

          # re: Java網絡編程從入門到精通(27):關閉服務端連接  回復  更多評論   

          不錯啊
          2009-08-04 11:39 | 凡客誠品

          # re: Java網絡編程從入門到精通(27):關閉服務端連接  回復  更多評論   

          好東西啊!
          2009-08-04 12:10 | 99讀書人

          # re: Java網絡編程從入門到精通(27):關閉服務端連接  回復  更多評論   

          非常不錯..

          http://www.qixian.net
          http://www.nod32id.com
          http://www.fanke1.com
          http://www.du84.com
          2009-08-04 17:20 | 不錯
          主站蜘蛛池模板: 昭觉县| 勐海县| 宝山区| 梁山县| 唐海县| 玛纳斯县| 会宁县| 洞口县| 龙州县| 互助| 门源| 临猗县| 吉林省| 宁波市| 寿宁县| 瓦房店市| 高密市| 饶阳县| 新宁县| 永泰县| 体育| 梧州市| 池州市| 西城区| 兴业县| 读书| 巴东县| 海晏县| 仁化县| 广灵县| 南澳县| 望谟县| 大同市| 枣庄市| 绵竹市| 克拉玛依市| 彭阳县| 连南| 喀喇| 晋宁县| 腾冲县|