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

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

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

2019-11-18 16:22:51
字體:
來源:轉載
供稿:網友

  by  Budi Kurniawan  2003-04-23
翻譯作者:-matrix開源技術-fajaven
英文原文:http://www.onjava.com/pub/a/onjava/2003/04/23/java_webserver.Html
  
編者注:這篇文章節選自 budi 自己出版的書<Tomcat 內幕>。你可以在他的網站得到更多的相關資料。

  一個 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

<html>
<head>
<title>HTTP Response Example</title></head><body>
Welcome to Brainy Software
</body>
</html>

  響應頭的第一行類似請求頭的第一行,告訴你所用的協議是 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 請求。

  
matrix開源技術經Onjava授權翻譯并發布.
如果你對此文章有任何看法或建議,請到Matrix論壇發表您的意見.
注明: 如果對matrix的翻譯文章系列感興趣,請點擊oreilly和javaworld文章翻譯計劃查看詳細情況
您也可以點擊-fajaven查看翻譯作者的詳細信息.

(出處:http://m.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜川县| 林周县| 永顺县| 平阴县| 开封市| 涪陵区| 浮梁县| 塘沽区| 灵山县| 海南省| 达日县| 通化市| 怀宁县| 彩票| 临颍县| 临清市| 杭州市| 鄂托克前旗| 滁州市| 龙里县| 抚顺市| 崇左市| 麦盖提县| 巴南区| 长宁县| 肃北| 绥中县| 左云县| 鸡西市| 南通市| 孝义市| 辛集市| 思茅市| 仙游县| 柘荣县| 噶尔县| 磴口县| 临汾市| 崇明县| 温州市| 湾仔区|