国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

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

  一個 Web 服務器也被稱為 HTTP 服務器,它通過 HTTP 協議與客戶端通信。這個客戶端通常指的是 Web 瀏覽器。一個基于 java 的 Web 服務器用到二個重要的類,java.net.Socket 與 java.net.ServerSocket ,并通過 HTTP 消息通信。因此,本文從討論 HTTP 與這二個類開始,然后我將解釋一個與本文相關的簡單的 Web 應用。
  
    The Hypertext Transfer PRotocol(HTTP)
  
    HTTP 是一種讓 Web 服務器與瀏覽器(客戶端)通過 Internet 發送與接收數據的協議。它是一個請求、響應協議--客戶端發出一個請求,服務器響應這個請求。HTTP 運用可靠的 TCP 連接,通常用的 TCP 80 端口。它的第一個版本是 HTTP/0.9 ,然后被 HTTP/1.0 取代。當前的版本是 HTTP/1.1 ,由 RFC2616(.pdf) 定義。
  
    本節主要對應 HTTP 1.1 ,足夠使你充分理解由 Web 服務器程序發出的消息。假如你對更加具體的知識有愛好,可以參考 RFC2616 。
  
    在 HTTP 中,客戶端總是通過建立一個連接與發送一個 HTTP 請求來發起一個事務。服務器不能主動去與客戶端聯系,也不能給客戶端發出一個回叫連接。客戶端與服務器端都可以提前中斷一個連接。例如,當用一個瀏覽器下載一個文件時,你可以通過點擊“停止”鍵來中斷文件的下載,關閉與服務器的 HTTP 連接。
  
    HTTP 請求
  
    一個 HTTP 請求包含三個部分:
  
  Method-URI-Protocol/Version 方法-地址-版本
  Request header 請求頭
  Entity body 請求實體
  

  
  
    下面是一個 HTTP 請求實例:
  
  POST /servlet/default.jsp HTTP/1.1
  Accept: text/plain; text/Html
  Accept-Language: en-gb
  Connection: Keep-Alive
  Host: localhost
  Referer: http://localhost/ch8/SendDetails.htm
  User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
  Content-Length: 33
  Content-Type: application/x-www-form-urlencoded
  Accept-Encoding: gzip, deflate
  
  LastName=Franks&FirstName=Michael
  
  The Method-URI-Protocol/Version 在這個請求的第一行:
  
  POST /servlet/default.jsp HTTP/1.1
  

  
  
    其中 POST 是請求的類型。每個客戶端 HTTP 請求可以是 HTTP 規范中指定的許多請求類型中的一種。HTTP 1.1 支持七種類型的請求,它們是 GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE。其中 GET 與 POST 是 Internet 應用中經常用到的二種請求類型。
  
    URI 完整地指定了 Internet 資源。一個 URI 通常被解析為相對服務器的根目錄。這樣,它應該總是以一個 '/' 前綴開始。一個 URL 實際上是 URI 的一種類型。
  
    Version 指的是該 HTTP 請求所用到的 HTTP 協議版本。
  
    請求頭包含了客戶端環境與請求實體的一些有用的信息。例如它包含瀏覽器設定的語言、實體的長度等等。每條請求頭用回車換行符(CRLF)分開。
  
    一個非常重要的空行分開了請求頭與實體,它標志著實體內容的開始。一些 Internet 開發書籍認為這個 CRLF 空行是 HTTP 請求的第四個部分。
  
    在上面的 HTTP 請求中,實體只是簡單以下的一行:
  
  LastName=Franks&FirstName=Michael
  

  
  
    在一個典型的 HTTP 請求中,請求實體內容會長得多。
  
    HTTP 響應
  
    與請求相似,HTTP 響應也由三部分組成:
  
  Protocol-Status code-Description 協議狀態 描述代碼
  Response headers 響應頭
  Entity body 響應實體
  

  
  
    以下是一個 HTTP 響應的實例:
  
  HTTP/1.1 200 OK
  Server: Microsoft-IIS/4.0
  Date: Mon, 3 Jan 1998 13:13:33 GMT
  Content-Type: text/html
  Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
  Content-Length: 112
  
  
  
  HTTP Response Example
  Welcome to Brainy Software
  
  
  

  
  
    響應頭的第一行類似請求頭的第一行,告訴你所用的協議是 HTTP 1.1 ,請求成功(200=sUCcess),以及沒有任何問題。
  
    響應頭類似請求頭也包含了一些有用的信息。響應的實體響應本身的 HTML 內容。頭與實體之間由回車換行的空行(CRLF)分開。
  
    Socket 類
  
    一個 socket 是一個網絡連接的端點,它使得一個應用可以從網絡讀與寫。在不同電腦上的二個應用軟件能夠通過收發字節流而彼此通信。要發一個信息到另一個應用程序,你需要知道它的IP地址,以及它的 socket 端口號。在 Java 中,一個 socket 用 java.net.Socket 來實現。
  
    要創建一個 socket ,你可以用 Socket 類中幾個構建方法中的一個。其中一個接受主機名與端口號作為參數:
  
  new Socket("yahoo.com", 80);
  

  
  
    一旦你成功地創建了一個 Socket 類的實例,你就可以用它去發送與接收字節流了。要發送字節流,你需要呼叫 Socket 類的 getOutputStream 方法來得到一個 java.io.OutputSteam 對象。要發送文本到遠程的程序,你通常需要從返回的 OutputStream 創建一個 java.io.PrintWriter 對象。要從連接的另一端接收字節流,你需要呼叫 Socket 類的 getInputStream 方法,它返回一個 java.io.InputStream 對象。
  
    以下代碼創建一個可以與本地 HTTP 服務器通信的 socket (127.0.0.1 表示一個本地的主機),發送一個 HTTP 請求,并接收從服務器的響應。它還創建一個 StringBuffer 對象來接受響應,并打印到控制臺。
  
  Socket socket = new Socket("127.0.0.1", "8080");
  OutputStream os = socket.getOutputStream();
  boolean autoflush = true;
  PrintWriter out = new PrintWriter( socket.getOutputStream(),
   autoflush );
  BufferedReader in = new BufferedReader(
   new InputStreamReader( socket.getInputStream() ));
  
  // send an HTTP request to the web server
  out.println("GET /index.jsp HTTP/1.1");
  out.println("Host: localhost:8080");
  out.println("Connection: Close");
  out.println();
  
  // read the response
  boolean loop = true;
  StringBuffer sb = new StringBuffer(8096);
  
  while (loop) {
   if ( in.ready() ) {
   int i=0;
   while (i!=-1) {
   i = in.read();
   sb.append((char) i);
   }
   loop = false;
   }
   Thread.currentThread().sleep(50);
  }
  
  // display the response to the out console
  System.out.println(sb.toString());
  socket.close();
  

  
  
    注重要從 web 服務器得到正確的響應,你必須要發送用 HTTP 協議編譯了的 HTTP 請求。假如你看了上面的 HTTP 部分,你應該能夠理解上面代碼中的 HTTP 請求。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉兴市| 金昌市| 阿坝| 新民市| 靖宇县| 富裕县| 油尖旺区| 错那县| 广昌县| 淮滨县| 古浪县| 扬州市| 乳源| 搜索| 柳州市| 望城县| 军事| 南澳县| 大厂| 荔浦县| 伊宁市| 泸溪县| 福泉市| 邯郸市| 凤城市| 颍上县| 合江县| 夏河县| 呈贡县| 日喀则市| 西乌珠穆沁旗| 西吉县| 渝中区| 小金县| 鄂托克前旗| 刚察县| 水富县| 航空| 津市市| 古浪县| 永兴县|