亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基于Java的Web服務器工作原理(2)

2019-11-18 12:52:00
字體:
來源:轉載
供稿:網友

  ServerSocket 類
  
    Socket 類描述的是“客戶端” socket,當你需要創建與遠程服務程序連接時需要用到它。假如你想實現一個服務程序,如 HTTP 服務器或者 FTP 服務器,則需要另外不同的方法。這是因為你的服務器必須隨時服務,它不知道什么時候會有一個客戶端程序需要連接它。
  
    因為這個目的,你需要用到 java.net.ServerSocket 這個類,它是服務器端 socket 的一個實現。服務器端 socket 等待來自客戶端的連接請求。一旦它收到一個連接請求,它創建一個 socket 實例來與客戶端進行通信。
  
    要創建服務器端 socket ,需要用到 ServerSocket 類提供的四個構建方法中的一個。你需要指定服務器端 socket 偵聽的 ip 地址與端口號。比較典型地,這個 IP 地址可以是 127.0.0.1 ,意思是該服務器端 socket 偵聽的是本地機器。服務器端 socket 偵聽的 IP 地址指的是綁定地址。服務器端 socket 另一個重要的屬性是隊列長度,即它拒絕請求前所接受的最大請求排隊長度。
  
    ServerSocket 類的構建方法之一如下:
  
  public ServerSocket(int port,int backLog,InetAddress bindingAddress);
  

  
  
    對于這個構建方法,綁定地址必須是 java.net.InetAddress 類的實例。創建一個 InetAddress 類的對象的簡單方法是呼叫其靜態方法 getByName ,傳遞一個包含主機名的字符串。
  
  InetAddress.getByName("127.0.0.1");
  

  
  
    以下行的代碼創建了一個服務器端 socket ,它偵聽本地機器的 8080 端口,限制隊列長度為 1 。
  
  new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1"));
  

  
  
    一旦有了一個 ServerSocket 實例,就可以通過呼叫其 accept 方法來讓它等待進來的鏈接請求。這個方法只有當接收到請求時才返回,它返回的是 Socket 類的實例。這個 Socket 對象就可以用來從客戶端應用程序發送與接收字節流,正如上節據說的那樣。實際上,accept 方法是本文例子中用到的唯一方法。
  
  應用實例
  
    我們的 web 服務器程序是 ex01.pyrmont 包的一部分,它包含三個類:HttpServer;Request;Response。
  
    整個程序的入口(靜態 main 方法)是 HttpServer 類。它創建一個 HttpServer 的實例,并呼叫其 await 方法。正如名字表達的,await 在一個特定的端口等待 HTTP 請求,處理它們,并返回響應給客戶端。它保持等待狀態,直到收到停止命令。(用方法名 await 代替 wait ,是因為 System 中有一個重要的與線程相關的方法)
  
    這個程序只從一個特定的目錄發送靜態資源,如 Html 與圖像文件。它只支持沒有文件頭(如日期與 cookie)的情況?,F在我們將在如下的幾節中看一下這三個類。
  
  HttpServer 類
  
    HttpServer 實現了一個 web 服務器,它可以提供(serve)特定目錄及其子目錄下的靜態資源。這個特定的目錄由 public static final WEB_ROOT 指定。
  
    WEB_ROOT 初始化如下:
  
  public static final String WEB_ROOT =
   System.get  

  
  
    代碼列表中包含了一具叫做 webroot 的目錄,里面有一些靜態的資源,你可以用來測試本應用。你也可以看到一個 servlet ,在我的下一篇文章將會被用到:“Servlets 容器是怎樣工作的”。
  
    為了請求一個靜態的資源,在瀏覽器的地址欄輸入如是地址:http://machinename:port/staticResources
  
    假如你從不同的機器上發送請求到運行本應用的機器,則 machinename 是運行應用機器的機器名或 IP 地址,port 是 8080 ,staticResources 是被請求的文件名稱,它必須包含在 WEB_ROOT 目錄內。
  
    例如,假如你用同一臺電腦來測試這個應用,你想要 HttpServer 發送 index.html 這個文件,用以下的地址:http://localhost:8080/index.html
  
    要停止服務,只需要從瀏覽器發送一個停止(shutdown)命令,即在瀏覽器的地址欄輸入 host:port 字段后,加上預先定義好的字符串。在我們的 HttpServer 類中,停止命令被定義為 SHUTDOWN ,一個 static final 變量。
  
  private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
  

  
  
    因此,要停止服務,你可以這樣:http://localhost:8080/SHUTDOWN
  
    現在,讓我們看一下列表 1.1 中給出的 await 方法。代碼列表后面將對這段代碼做一些解釋。
  
  Listing 1.1. The HttpServer class' await method
  
  public void await() {
   ServerSocket serverSocket = null;
   int port = 8080;
   try {
   serverSocket = new ServerSocket(port, 1,
   InetAddress.getByName("127.0.0.1"));
   }
   catch (IOException e) {
   e.printStackTrace();
   System.exit(1);
   }
  
   // Loop waiting for a request
   while (!shutdown) {
   Socket socket = null;
   InputStream input = null;
   OutputStream output = null;
   try {
   socket = serverSocket.accept();
   input = socket.getInputStream();
   output = socket.getOutputStream();
  
   // create Request object and parse
   Request request = new Request(input);
   request.parse();
  
   // create Response object
   Response response = new Response(output);
   response.setRequest(request);
   response.sendStaticResource();
  
   // Close the socket
   socket.close();
  
   //check if the previous URI is a shutdown command
   shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
   }
   catch (Exception e) {
   e.printStackTrace();
   continue;
   }
   }
  }
  

  
  
    await 方法以創建一個 ServerSocket 實例開始,然后進入一個 while 的循環。
  
  serverSocket = new ServerSocket(
   port, 1, InetAddress.getByName("127.0.0.1"));
  ...
  // Loop waiting for a request
  while (!shutdown) {
   ...
  }
  

  
  
    在 while 循環中的代碼,運行到 ServerSocket 的 accept 方法即停止。這個方法只有在 8080 端口接收到 HTTP 請求才返回:
  
  socket = serverSocket.accept();
  

  
  
    收到請求后,await 方法從 accept 方法返回的 Socket 實例中等到 java.io.InputStream 與 java.io.OutputStream:
  
  input = socket.getInputStream();
  output = socket.getOutputStream();
  

  
  
    然后 await 方法創建一個 Request 對象,呼叫它的 parse 方法來解析這個原始的 HTTP 請求:
  
  // create Request object and parse
  Request request = new Request(input);
  request.parse();
  

  
  
    下一步,await 方法創建一個 Response 對象并把 Request 對象設置給它,呼叫它的 sendStaticResource 方法:
  
  // create Response object
  Response response = new Response(output);
  response.setRequest(request);
  response.sendStaticResource();
  

  
  
    最后,await 方法關閉 Socket ,呼叫 Request 的 getUri 方法來檢查 HTTP 請求的地址是否是一個停止命令。假如是,則 shutdown 變量被設置為 true ,程序退出 while 循環:
  
  // Close the socket
  socket.close();
  //check if the previous URI is a shutdown command
  shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲欧美成人| 精品高清一区二区三区| 欧美性生交大片免网| 91在线直播亚洲| 成人精品一区二区三区电影免费| 成人精品aaaa网站| 亚洲国产日韩欧美在线动漫| 亚洲精品国产成人| 亚洲人成在线电影| 国产精品久久久久久久久久三级| 伊人久久男人天堂| 91系列在线播放| 宅男66日本亚洲欧美视频| 国产精品看片资源| 日韩av成人在线| 久久综合免费视频| 久久久久久网站| 久久九九亚洲综合| 欧美专区第一页| 狠狠躁夜夜躁人人躁婷婷91| 最新的欧美黄色| 国产在线视频2019最新视频| 日本一区二区三区在线播放| 亚洲午夜精品久久久久久性色| 日韩中文在线中文网三级| 欧美国产亚洲精品久久久8v| 国产精品主播视频| 久久久精品2019中文字幕神马| 久久免费少妇高潮久久精品99| 国产精品久久久久久久久| 亚洲成在人线av| 91亚洲精品一区二区| 91爱爱小视频k| 欧美极品美女电影一区| 精品亚洲aⅴ在线观看| 欧美一级成年大片在线观看| 久久影视电视剧免费网站| 欧美日韩国产黄| 91av中文字幕| 中文字幕成人精品久久不卡| 欧美日韩免费区域视频在线观看| 亚洲а∨天堂久久精品喷水| 欧美成年人视频网站| 亚洲国产天堂久久国产91| 中文字幕欧美日韩va免费视频| 成人写真视频福利网| 久久免费视频这里只有精品| 亚洲最新在线视频| 91在线直播亚洲| 欧美在线国产精品| 97在线视频免费| 日韩欧美精品网址| 精品国产区一区二区三区在线观看| 91沈先生作品| 国产在线精品播放| 亚洲欧美激情四射在线日| 不卡伊人av在线播放| 国产精品美女免费视频| 欧美日韩国产精品一区二区不卡中文| 日韩的一区二区| 欧美另类极品videosbestfree| 亚洲国产精品小视频| 欧美极品在线播放| 久久久久久成人| 国产精品都在这里| 亚洲美女在线观看| 78m国产成人精品视频| 视频在线观看99| 久久免费视频在线| 欧美亚洲国产成人精品| 国产精品久久久久不卡| 中文字幕精品—区二区| 国内精品久久影院| 国产一区二区三区在线观看网站| 欧美另类99xxxxx| 中文字幕一区日韩电影| 欧美成人午夜激情| 色在人av网站天堂精品| 成人在线视频福利| 国产女精品视频网站免费| 尤物99国产成人精品视频| 国产日产久久高清欧美一区| 91色视频在线导航| 免费av在线一区| 欧美大片欧美激情性色a∨久久| 久久精品亚洲94久久精品| 91成人国产在线观看| 亚洲人高潮女人毛茸茸| 国产精品美女www爽爽爽视频| 美女国内精品自产拍在线播放| 国产欧美在线看| 欧美激情视频免费观看| 欧美亚洲国产精品| 91成品人片a无限观看| 久久久电影免费观看完整版| 中文字幕精品久久| 欧美在线视频一二三| 在线观看国产精品日韩av| 日本久久中文字幕| 91精品国产综合久久香蕉的用户体验| 中文字幕v亚洲ⅴv天堂| 国产精品久久久久久av福利| 欧美二区在线播放| 日韩精品免费综合视频在线播放| 国产精品久久久久久久久男| 欧美激情图片区| 国产福利视频一区| 欧美人与物videos| 丰满岳妇乱一区二区三区| 5278欧美一区二区三区| 国产精品海角社区在线观看| 国产精品高潮呻吟久久av无限| 久久五月天综合| 精品日本高清在线播放| 精品亚洲一区二区三区| 日韩精品视频三区| 欧美高清视频在线| 国产亚洲一区二区在线| 成人美女av在线直播| 欧美精品制服第一页| 亚洲黄色免费三级| 日韩电影免费观看在线观看| 久久久电影免费观看完整版| 国产精品精品国产| 欧美高清视频一区二区| 91精品国产99久久久久久| 国产精品久久久精品| 精品国产福利视频| 日韩中文字幕免费| 欧美中文字幕在线播放| 国产精品视频不卡| 国产精品一区二区久久精品| 成人欧美在线视频| 欧美激情喷水视频| 国产精品高清免费在线观看| 国产精品极品美女粉嫩高清在线| 久久大大胆人体| 欧美亚洲国产另类| 欧美性极品少妇精品网站| 伊人男人综合视频网| 国产成人91久久精品| 日韩欧美一区二区三区久久| 主播福利视频一区| 91香蕉电影院| 欧美日韩午夜激情| 欧美性猛交xxxx乱大交3| 亚洲国产精品久久久久秋霞蜜臀| 国产在线98福利播放视频| 国产精品高潮呻吟久久av无限| 亚洲欧美一区二区三区四区| 伊人亚洲福利一区二区三区| 中文字幕亚洲第一| 欧美xxxx做受欧美.88| 91在线免费看网站| 欧美超级免费视 在线| 日产精品久久久一区二区福利| 91免费人成网站在线观看18| 日本韩国在线不卡| 亚洲第一区中文字幕| 国产精品69精品一区二区三区| 性色av一区二区咪爱| 欧美怡春院一区二区三区| 日韩在线观看免费全集电视剧网站| 欧美插天视频在线播放|