熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java網絡編程-Java Socket編程(三)

2022-06-13   來源: Java核心技術 

  服務器Sockets

  列表是一個服務器應用程序的一部分
  
  列表 一個簡單的服務器程序
  /**
  * 一個監聽端口並提供HTML文檔的程序
  */
  class SimpleWebServer
   {
   public static void main(String args[])
    {
    ServerSocket serverSocket = null;
    Socket clientSocket = null;
    int connects = ;
    try
     {
     // 建立一個服務器socket
     serverSocket = new ServerSocket( );
     while (connects < )
      {
      // 等待連接
      clientSocket = serverSocketaccept();
      //服務連接
      ServiceClient(clientSocket);
      connects++;
      }
     serverSocketclose();
     }
    catch (IOException ioe)
     {
     Systemoutprintln(Error in SimpleWebServer: + ioe);
     }
    }
   public static void ServiceClient(Socket client)
   throws IOException
    {
    DataInputStream inbound = null;
    DataOutputStream outbound = null;
    try
     {
     // 得到IO流
     inbound = new DataInputStream( clientgetInputStream());
     outbound = new DataOutputStream( clientgetOutputStream());
     //格式化輸出(回應頭和很少的HTML文檔)
     StringBuffer buffer = PrepareOutput();
     String inputLine;
     while ((inputLine = inboundreadLine()) != null)
      {
      //如果到了HTTP請求的尾部就發送回應
      if ( inputLineequals() )
       {
       outboundwriteBytes(buffertoString());
       break;
       }
      }
     }
     finally
      {
      // 清除
      Systemoutprintln(Cleaning up connection: + client);
      tln(Cleaning up connection: + client);
      outboundclose();
      inboundclose();
      clientclose();
      clientclose();
      }
    }
   }

  服務器Sockets

  服務器並不是主動地建立連接相反地他們是被動地監聽一個客戶端的連接請示然後給他們服務服務器是由類ServerSocket來建立的下面的程序建立了一個服務器端socket並把它綁定到端口

  ServerSocket serverSocket = new ServerSocket( );

  第一個參數是服務器要監聽的端口第二個參數是可選的API文檔中說明了這是一個監聽時間但是在傳統的socket程序中第二個參數是監聽深度一個服務器可以同時接收多個連接請求但是每次只能處理一個監聽堆是一個無回答的連接請求隊列上面的請求建立一個連接來處理最後五個請求如果省略了後面的一個參數則默認值是

  ServerSocket serverSocket = new ServerSocket( );

  一旦socket建立了並開始監聽連接進來的連接將會建立並放在監聽堆accetp()方法把在堆中的連接取出來

  Socket clientSocket = serverSocketaccept();

  這個方法返回一個用來與來訪者對話的客戶端連接服務器本身不可能建立對話相反地服務器socket會使用accept()方法來產生一個新的socket服務器socket依舊打開並排列新的連接請求

  與客戶端socket一樣下面的一步建立輸入和輸出流

  DataInputStream inbound = new DataInputStream( clientSocketgetInputStream());
  DataOutputStream outbound = new DataOutputStream( clientSocketgetOutputStream() );

  一般的I/O操作可以在新建的流中運用在服務器回應前它等待客戶端發送一個空白的行當會話結束時服務器關閉流和客戶端socket如果在隊列中沒有請示將會出現什麼情況呢?那個方法將會等待一個的到來這個行為叫阻塞accept()方法將會阻塞服務器線程直到一個呼叫到來個連接處理完閉之後服務器退出任何的在隊列中的呼叫將會被取消

  所有的服務器都要有以下的基本的步驟

  建立一個服務器socket並開始監聽
  使用accept()方法取得新的連接
  建立輸入和輸出流
  在已有的協議上產生會話
  關閉客戶端流和socket
  回到第二步或者到第七步
  關閉服務器socket


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27218.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.