基於JAVA的WEB伺服器工作機制(1)

來源:互聯網
上載者:User

基於JAVA的WEB伺服器工作機制(1)

一個WEB伺服器也被稱為一個HTTP伺服器,因為它使用HTTP協議和它的客戶進行通訊,而這些客戶通常是瀏覽器。 一個基於JAVA的WEB伺服器使用了兩個重要的類:java.net.Socket和java.net.ServerSocket,並且是通過HTTP訊息進行通訊的。本文開頭將討論HTTP和這兩個類,後面,將解釋一個簡單WEB伺服器應用程式的工作機制。

超文字傳輸通訊協定 (HTTP) (HTTP)

HTTP協議允許伺服器和客戶機通過INTERNET接收和發送資料。它是個請求和回應協議----客戶機發送請求,伺服器對請求給出回應。HTTP 使用可靠的TCP 串連,預設TCP連接埠是80。HTTP的第一版是HTTP/0.9,隨後被 HTTP/1.0所取代。當前最新的版本是HTTP/1.1,這個在RPC2616規範文檔中給出了定義。

這一章節簡單講敘了HTTP 1.1, 對於你理解WEB伺服器應用程式發送的訊息還是足夠的。如果你高度興趣,可以參考RFC 2616文檔。

使用HTTP,用戶端通過建立一個串連和發送一個HTTP請求來初始化事務會話,伺服器聯絡用戶端或者回應一個callback串連給用戶端。 它們都可以中斷串連。比如,在使用WEB瀏覽器時,你可以點擊瀏覽器上的STOP按鈕來停止檔案下載進程,就有效關閉了和這個WEB伺服器的HTTP串連。

HTTP 要求(Requests)

一個HTTP request包含三個部分:

  • 方法,URL,協議/版本(Method-URI-Protocol/Version)
  • 請求包頭Request headers
  • 實體包(Entity body)

下面給出一個HTTP請求的範例:

POST /servlet/default.jsp HTTP/1.1Accept: 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

請求的第一行就是method-URI-Protocol/Version。

POST /servlet/default.jsp HTTP/1.1

請求的是POST方法,後面的 /servlet/default.jsp 表示一個URL地址,HTTP/1.1表示協議的版本。

HTTP標準規範定義了一些要求方法,用來給每個HTTP請求所使用。HTTP 1.1支援7中要求方法: GET, POST, HEAD, OPTIONS, PUT, DELETE, 和 TRACE。 GETPOST 在INTERNET的應用程式中是使用最普遍的兩個方法。

URI完整的指明了一個INTERNET資源。一個URI通常是相對於伺服器的根目錄被解釋的。 因此,它總是使用符號(/)開頭。一個URL實際是一個URI類型。協議版本表示當前正在使用的HTTP協議的版本。

請求包頭(request header)包含了一些有用的客戶機環境的資訊和請求的實體(entity body)資訊。比如,它可以包含瀏覽器使用的語言和實體的長度等等。每個請求包頭都被CRLF(斷行符號換行)序列所分離。

在先前的HTTP請求中,實體是下面簡單的一行:

LastName=Franks&FirstName=Michael

在一個典型的HTTP請求中,這個實體能夠很容易地變得更長。

HTTP響應(Responses)

和請求類似,一個HTTP響應也包含三個部分:

  • 協議狀態 代碼描敘(Protocol-Status code-Description)
  • 響應包頭(Response headers)
  • 實體(Entity body)

下面是HTTP響應的一個簡單範例:

HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Mon, 3 Jan 1998 13:13:33 GMTContent-Type: text/htmlLast-Modified: Mon, 11 Jan 1998 13:23:42 GMTContent-Length: 112<html><head><title>HTTP Response Example</title></head><body>Welcome to Brainy Software</body></html>

第一行的響應包頭和上面的請求包頭很相似。 第一行告訴我們,協議是使用的HTTP1.1,響應請求已成功(200表示成功),一切已OK。

響應包頭和請求包頭相似,也包含一些有用的資訊。響應的實體是HTML那一部分的內容。包頭和實體也都是被CRLF序列分離開的。

Socket類

通訊端(socket)是網路連接的一個端點。它使得應用程式能夠通過網路進行讀和寫的操作。 通過在串連上發送和接受位元組流,兩個位於不同電腦的軟體程式能夠彼此相互連訊。為了發送一個訊息到另一個程式,你需要知道對方機器的IP地址和socket連接埠號碼。在JAVA中,一個socket是由java.net.Socket類所表示的。

為了建立一個通訊端,你可以使用Socket類的建構函式來完成。 這些建構函式接受主機名稱和連接埠:

public Socket(String host, int port)

host表示遠端電腦名或者IP地址,port表示該遠程應用的連接埠號碼。比如,要在80連接埠串連到yahoo.com,你需要構造下面的socket:

new Socket("yahoo.com", 80);

一旦你成功建立了一個Socket類的執行個體,就可以使用它來發送和接受位元組流了。 要發送位元組流,必須首先調用Socket類的getOutputStream 方法來獲得一個java.io.OutputStream對象。要發送一個文本到遠程應用程式,經常要構造一個從OutputStream對象返回的java.io.PrintWriter對象。要接收串連另一端的位元組流,要調用Socket類的getInputStream方法,該方法是從 java.io.InputStream返回的。

下面的程式段建立了一個socket,和本地HTTP伺服器(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 serverout.println("GET /index.jsp HTTP/1.1");out.println("Host: localhost:8080");out.println("Connection: Close");out.println();// read the responseboolean 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 consoleSystem.out.println(sb.toString());socket.close();

要從伺服器得到一個確切的響應,你需要發送一個遵循HTTP協議規則的HTTP請求。如果你閱讀了上面的那段"超文字傳輸通訊協定 (HTTP)(HTTP)" ,那麼你就應該能夠理解剛才上面建立socket的代碼。

Translated by Willpower,2003.11.23

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.