方槍槍的java世界

          不要因為風雨飄落就停止了你的腳步,真正的得失就在你的心中。 做喜歡做的事,不輕言放棄!

          00 一個簡單的HttpServer

          本周開始,開發一個簡單的HttpServer,歡迎大家指正。

          中間借鑒了一些網友的代碼,在此致謝,參見如下:

          /**
           * 一個簡單的用 Java Socket 編寫的 HTTP 服務器應用, 演示了請求和應答的協議通信內容以及 給客戶端返回 HTML 文本和二進制數據文件(一個圖片), 同時展示了 404, 200 等狀態碼.
           * 首先運行這個程序,然后打開Web瀏覽器,鍵入http://localhost,則這個程序能夠顯示出瀏覽器發送了那些信息 并且向瀏覽器返回一個網頁和一副圖片, 并測試同瀏覽器對話. 當瀏覽器看到 HTML 中帶有圖片地址時,
           * 則會發出第二次連接來請求圖片等資源. 這個例子可以幫您理解 Java 的 HTTP 服務器軟件是基于 J2SE 的 Socket 等軟件編寫的概念, 并熟悉 HTTP 協議. 相反的用 Telnet
           * 連接到已有的服務器則可以幫忙理解瀏覽器的運行過程和服務器端的返回內容.
           *
           * <pre>
           *       當用戶在Web瀏覽器地址欄中輸入一個帶有http://前綴的URL并按下Enter后,或者在Web頁面中某個以http://開頭的超鏈接上單擊鼠標,HTTP事務處理的第一個階段--建立連接階段就開始了.HTTP的默認端口是80.
           *    隨著連接的建立,HTTP就進入了客戶向服務器發送請求的階段.客戶向服務器發送的請求是一個有特定格式的ASCII消息,其語法規則為:
           * < Method > < URL > < HTTP Version > <\n>
           * { <Header>:<Value> <\n>}*
           * <\n>
           * { Entity Body }
           *    請求消息的頂端是請求行,用于指定方法,URL和HTTP協議的版本,請求行的最后是回車換行.方法有GET,POST,HEAD,PUT,DELETE等.
           * 在請求行之后是若干個報頭(Header)行.每個報頭行都是由一個報頭和一個取值構成的二元對,報頭和取值之間以":"分隔;報頭行的最后是回車換行.常見的報頭有Accept(指定MIME媒體類型),Accept_Charset(響應消息的編碼方式),Accept_Encoding(響應消息的字符集),User_Agent(用戶的瀏覽器信息)等.
           *    在請求消息的報頭行之后是一個回車換行,表明請求消息的報頭部分結束.在這個\n之后是請求消息的消息實體(Entity Body).具體的例子參看httpRequest.txt.
           *     Web服務器在收到客戶請求并作出處理之后,要向客戶發送應答消息.與請求消息一樣,應答消息的語法規則為:
           * < HTTP Version> <Status Code> [<Message>]<\n>
           * { <Header>:<Value> <\n> } *
           * <\n>
           * { Entity Body }
           *    應答消息的第一行為狀態行,其中包括了HTTP版本號,狀態碼和對狀態碼進行簡短解釋的消息;狀態行的最后是回車換行.狀態碼由3位數字組成,有5類:
           * 參看:HTTP應答碼及其意義
           *
           * 1XX 保留
           * 2XX 表示成功
           * 3XX 表示URL已經被移走
           * 4XX 表示客戶錯誤
           * 5XX 表示服務器錯誤
           * 例如:415,表示不支持改媒體類型;503,表示服務器不能訪問.最常見的是200,表示成功.常見的報頭有:Last_Modified(最后修改時間),Content_Type(消息內容的MIME類型),Content_Length(內容長度)等.
           *    在報頭行之后也是一個回車換行,用以表示應答消息的報頭部分的結束,以及應答消息實體的開始.
           *    下面是一個應答消息的例子:
           * HTTP/1.0 200 OK
           * Date: Moday,07-Apr-97 21:13:02 GMT
           * Server:NCSA/1.1
           * MIME_Version:1.0
           * Content_Type:text/html
           * Last_Modified:Thu Dec 5 09:28:01 1996
           * Coentent_Length:3107
           *
           * <HTML><HEAD><TITLE></HTML>
           *
           * 在用Java語言實現HTTP服務器時,首先啟動一個java.net.ServerSocket在提供服務的端口上監聽連接.向客戶返回文本時,可以用PrintWriter,但是如果返回二進制數據,則必須使用OutputStream.write(byte[])方法,返回的應答消息字符串可以使用String.getBytes()方法轉換為字節數組返回,或者使用PrintStream的print()方法寫入文本,用write(byte[])方法寫入二進制數據.
           *
           * </pre>
           *
           * @author 劉長炯
           * @version 1.0 2007-07-24 Sunday
           */

          posted on 2012-07-09 22:10 做強大的自己 閱讀(222) 評論(0)  編輯  收藏 所屬分類: Socket

          主站蜘蛛池模板: 中方县| 永清县| 岳阳市| 和顺县| 鹤岗市| 平塘县| 龙井市| 灵寿县| 富锦市| 盐亭县| 曲麻莱县| 金华市| 宣武区| 黄陵县| 石城县| 永春县| 恭城| 台安县| 岳阳市| 康马县| 芮城县| 太白县| 乌海市| 湘潭市| 皮山县| 平遥县| 项城市| 九龙县| 甘德县| 高唐县| 临沭县| 洛浦县| 虞城县| 桐柏县| 横峰县| 宜都市| 翁牛特旗| 金塔县| 区。| 葫芦岛市| 平远县|