程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java Socket編程(三)服務器Sockets

Java Socket編程(三)服務器Sockets

編輯:JAVA編程入門知識

        服務器Sockets
  
  列表9.2是一個服務器應用程序的一部分.
  
  列表9.2 一個簡單的服務器程序
  
  /**
  * 一個監聽端口並提供Html文檔的程序.
  */
  class SimpleWebServer {
  public static void main(String args[])
  {
  ServerSocket serverSocket = null;
  Socket clientSocket = null;
  int connects = 0;
  try
  {
  {
  // 建立一個服務器socket
  serverSocket = new ServerSocket(80, 5);
  while (connects < 5)
  {
  // 等待連接
  clientSocket = serverSocket.accept();
  //服務連接
  ServiceClient(clientSocket);
  connects++;
  }
  serverSocket.close();
  }
  catch (IOException ioe)
  {
  System.out.println("Error in SimpleWebServer: " + ioe);
  }
  }
  public static void ServiceClient(Socket client)
  throws IOException
  {
  DataInputStream inbound = null;
  DataOutputStream outbound = null;
  try
  {
  // 得到IO流
  inbound = new DataInputStream( client.getInputStream());
  outbound = new DataOutputStream( client.getOutputStream());
  //格式化輸出(回應頭和很少的HTML文檔)
  StringBuffer buffer = PrepareOutput();
  String inputLine;
  while ((inputLine = inbound.readLine()) != null)
  {
  //假如到了HTTP請求的尾部,就發送回應
  if ( inputLine.equals("") )
  {
  outbound.writeBytes(buffer.toString());
  break;
  }
  }
  }
  finally
  {
  // 清除
  System.out.println("Cleaning up connection: " + client);
  tln("Cleaning up connection: " + client);
  outbound.close();
  inbound.close();
  client.close();
  client.close();
  }
  }

服務器並不是主動地建立連接.相反地,他們是被動地監聽一個客戶端的連接請示然後給他們服務.服務器是由類ServerSocket來建立的.下面的程序建立了一個服務器端socket並把它綁定到80端口:
  
  ServerSocket serverSocket = new ServerSocket(80, 5);
  
  第一個參數是服務器要監聽的端口.第二個參數是可選的.API文檔中說明了這是一個監聽時間,但是在傳統的socket程序中第二個參數是監聽深度.一個服務器可以同時接收多個連接請求,但是每次只能處理一個.監聽堆是一個無回答的連接請求隊列.上面的請求建立一個連接來處理最後五個請求.假如省略了後面的一個參數,則默認值是50.
  
  ServerSocket serverSocket = new ServerSocket(80, 5);
  
  一旦socket建立了並開始監聽連接,進來的連接將會建立並放在監聽堆.accetp()方法把在堆中的連接取出來.
  
  Socket clientSocket = serverSocket.accept();
  
  這個方法返回一個用來與來訪者對話的客戶端連接.服務器本身不可能建立對話,相反地,服務器socket會使用accept()方法來產生一個新的socket.服務器socket依舊打開並排列新的連接請求.
  
  與客戶端socket一樣,下面的一步建立輸入和輸出流:
  
  DataInputStream inbound = new DataInputStream( clientSocket.getInputStream() ); DataOutputStream outbound = new DataOutputStream( clientSocket.getOutputStream() );
  
  一般的I/O操作可以在新建的流中運用.在服務器回應前它等待客戶端發送一個空白的行.當會話結束時,服務器關閉流和客戶端socket.假如在隊列中沒有請示將會出現什麼情況呢?

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