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

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

一個簡單的web服務器例子

2019-11-14 23:33:20
字體:
來源:轉載
供稿:網友
一個簡單的web服務器例子

一個簡單的web容器小例子,功能十分簡單,只能訪問靜態資源,對于新手來說還是有一定的意義。主要分三個類

1、server類:主要功能開啟socketServer,阻塞server,接收socket訪問,解析request,創建request,作出響應

public class TestServer1 {        PRivate boolean shutdown = false;        // web目錄webroot    public static final String WEB_ROOT = System.getProperty("user.dir")             + File.separator +  "WebRoot";        public static final String SHUTDOWN_COMMAND = "/SHUTDOWN";        public static void main(String[] args) {        TestServer1 server = new TestServer1();        server.await();    }        public void await() {                // 第一步、創建出serverSocket監聽本機8080端口        ServerSocket server = null;        int port = 8080;        try {            server = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));        } catch (Exception e) {            e.printStackTrace();        }                 // 第二步、輪詢阻塞住socketServer        while(!shutdown) {            Socket socket = null;            InputStream input = null;            OutputStream output = null;                        try {                socket = server.accept();                input = socket.getInputStream();                output = socket.getOutputStream();                                // 第三步、創建出request,解析request請求                Request req = new Request(input);                req.parseRequest();                                // 第四步、創建response                Response response = new Response(output);                response.setRequest(req);                                // 第五步、發送簡單靜態資源,關閉socket結束本次會話                response.sendStaticRes();                socket.close();                                // 關閉指令                shutdown = req.getUri().equals(SHUTDOWN_COMMAND);            } catch (IOException e) {                e.printStackTrace();            }        }            }    }

當然了上面的是最簡單的實現,也不能實現多線程,實際上的web容器肯定會創建一個線程池來接收請求

2、request 主要的工作解析input流,封裝成request

class Request {        private InputStream input;        private String uri;        public Request(InputStream input) {        this.input = input;    }            /**     * 解析request請求內容     * GET /index.html HTTP/1.1     *    Accept: text/html, application/xhtml+xml, *//*     *    Accept-Language: zh-CN     *    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MALCJS; rv:11.0) like Gecko     *    Accept-Encoding: gzip, deflate     *    Host: localhost:8080     *    DNT: 1     *    Connection: Keep-Alive     *    Cookie: 這個地方應該如果有cookie,如果有session還有jsessionId的     */    public void parseRequest() {     // 為什么只獲取2048個字符,這是因為request請求內容的長度,出于安全或者其他方面的考慮,在瀏覽器端和服務器端都會做這么一個限制。         StringBuffer buffer = new StringBuffer(2048);        byte[] bytes = new byte[2048];        int i;        try {            i = input.read(bytes);        } catch (IOException e) {            e.printStackTrace();            i=-1;        }        for(int k=0; k<i; k++) {            buffer.append((char)bytes[k]);        }        System.out.println(buffer.toString());        uri = parseUri(buffer.toString());    }        /**     * GET /index.html HTTP/1.1 uri的位置     * @param reqStr     * @return     */    private String parseUri(String reqStr) {        int index1, index2;        index1 = reqStr.indexOf(' ');        if (index1 != -1) {          index2 = reqStr.indexOf(' ', index1 + 1);          if (index2 > index1)            return reqStr.substring(index1 + 1, index2);        }        return null;    }        public String getUri() {        return uri;    }    }

解析成的http請求的具體內容,作為web開發人員應該要熟悉每個字段的意義,這個請求是瀏覽器本身按照http協議封裝的一個請求,能夠手寫出這個請求當然更好。

3、response 通過request的uri找到對應的資源對請求作出響應,實際的情況肯定是有靜態和動態資源例如servlet/filter等等,但是這里只是做了簡單的靜態的處理了

class Response {        private OutputStream output;        private Request request;        public Response(OutputStream output) {        this.output = output;    }        public void setRequest(Request req) {        this.request = req;    }        /**     * 簡單處理靜態資源     * @throws IOException     */    public void sendStaticRes() throws IOException {                FileInputStream fis = null;        try {            File staticFile = new File(TestServer1.WEB_ROOT, request.getUri());            if(staticFile.exists()) {                fis = new FileInputStream(staticFile);                int i = 0;                byte[] buf = new byte[1024];          // 流的對拷                i = fis.read(buf, 0, 1024);                while(i!=-1) {                    output.write(buf, 0, i);                    i = fis.read(buf, 0, 1024);                }            } else {                // file not found 404                String errorMessage = "HTTP/1.1 404 File Not Found/r/n" +                  "Content-Type: text/html/r/n" +                  "Content-Length: 23/r/n" +                  "/r/n" +                  "<h1>File Not Found</h1>";                output.write(errorMessage.getBytes());            }        } catch (Exception e) {            e.printStackTrace();        } finally{            if(fis!=null)                fis.close();            fis = null;        }    }}

同樣響應內容你也應該要熟悉哪些組成部分

HTTP/1.1 200 OK  //響應行Date: Sat, 31 Dec 2005 23:59:59 GMTContent-Type: text/html;charset=ISO-8859-1Content-Length: 122<html><head><title>Test</title></head><body>This my page</body></html>

至此一個簡單的web容器就寫好了,能夠訪問webRoot目錄下的靜態資源。

可以通過瀏覽器訪問,也可以通過telnet端進行訪問。在cmd命令行下telnet localhost 8080,就會連接上socketServer,然后就會等待輸入,自然我們輸入對應的請求報文,回車響應內容就出現了。

以上原創文章出自老羅家的樹博客地址:http://www.49028c.com/TimBing/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情网友自拍| 亚洲国产精品va在线观看黑人| 欧美老少做受xxxx高潮| 久久久久亚洲精品| 国产精品99免视看9| 中文字幕亚洲综合| 亚洲桃花岛网站| 88国产精品欧美一区二区三区| 精品久久中文字幕久久av| 亚洲一区二区三区四区视频| 欧美色欧美亚洲高清在线视频| 国产在线视频2019最新视频| 亚洲天堂一区二区三区| 国产精品中文字幕久久久| 国产精品自拍偷拍视频| 成人亚洲欧美一区二区三区| 国语自产精品视频在线看抢先版图片| 一级做a爰片久久毛片美女图片| 欧美夫妻性生活视频| 久久久久久久国产精品视频| 久久视频国产精品免费视频在线| 高清日韩电视剧大全免费播放在线观看| 亚洲人成绝费网站色www| 欧美高跟鞋交xxxxhd| 日韩亚洲欧美中文高清在线| 亚洲最大福利网站| 久久天天躁狠狠躁夜夜躁2014| 韩国v欧美v日本v亚洲| 欧美大奶子在线| 国产精品成久久久久三级| 精品久久久香蕉免费精品视频| 日韩亚洲在线观看| 精品国产老师黑色丝袜高跟鞋| 欧美日韩不卡合集视频| 亚洲欧洲成视频免费观看| 亚洲天堂av电影| 亚洲在线www| 欧美一级淫片aaaaaaa视频| 日韩精品在线免费| 奇门遁甲1982国语版免费观看高清| 久久精品视频在线| 国产亚洲欧美aaaa| 中文字幕不卡在线视频极品| 色综合老司机第九色激情| 亚洲91精品在线| 国产成人av在线| 97在线视频国产| 亚洲一区二区少妇| 91高清视频免费| 欧美性受xxxx黑人猛交| 午夜精品久久久久久久白皮肤| 国产精品mp4| 久久久久久久久久久成人| 国产美女直播视频一区| 久久久久国产精品免费网站| 欧美另类精品xxxx孕妇| 亚洲人成电影网站色www| 一级做a爰片久久毛片美女图片| 蜜臀久久99精品久久久无需会员| 日韩中文字幕欧美| 日韩亚洲欧美中文在线| 91理论片午午论夜理片久久| 欧美精品成人91久久久久久久| 亚洲视频在线免费观看| 亚洲视频电影图片偷拍一区| 亚洲精品视频中文字幕| 国产成人亚洲精品| 久久久999精品免费| 日韩精品高清视频| 久久露脸国产精品| 色婷婷久久一区二区| 91啪国产在线| 亚洲一区国产精品| 久久中文字幕在线| 亚洲欧美在线磁力| 亚洲自拍小视频| 国产在线精品播放| 亚洲高清久久网| 啊v视频在线一区二区三区| 免费91在线视频| 欧美日韩ab片| 68精品国产免费久久久久久婷婷| 国产视频综合在线| 国产精品视频白浆免费视频| 亚洲国产免费av| 久久6免费高清热精品| 国产亚洲欧洲在线| 亚洲人成电影网站色www| 欧美疯狂xxxx大交乱88av| 国产一区二区三区视频免费| 国产精品普通话| 欧美性资源免费| 国产亚洲精品美女久久久| 在线观看日韩视频| 日韩欧美主播在线| 亚洲人高潮女人毛茸茸| 国产97在线视频| 亚洲美女在线观看| 91国语精品自产拍在线观看性色| 久久成人精品电影| 亚洲精品免费网站| 欧美日韩黄色大片| 国产精品热视频| 日韩暖暖在线视频| 日韩精品极品在线观看播放免费视频| 亚洲人成网站在线播| 国产精品福利观看| 欧美日韩在线观看视频小说| 日韩av网站电影| 亚洲精品在线看| 国产精品视频中文字幕91| 亚洲高清在线观看| 亚洲女性裸体视频| 欧洲午夜精品久久久| 亚洲欧美日韩中文在线制服| 亚洲精品久久久久久久久久久久久| 欧美在线影院在线视频| 欧美专区第一页| 欧美日韩一区二区在线播放| 精品一区二区三区四区| 欧美日韩午夜视频在线观看| 色偷偷av一区二区三区| 亚洲影影院av| 国产精品久久久久久久久久久不卡| 国产精品久久久久不卡| 国产成人精品在线播放| 欧洲亚洲在线视频| 国产精品自产拍在线观看| 国产精品美女主播| 欧美激情一二区| 欧美日韩一区二区免费视频| 国产中文欧美精品| 播播国产欧美激情| 欧美激情一区二区三区在线视频观看| 日韩精品视频免费在线观看| 日韩在线小视频| 日韩精品在线第一页| 少妇高潮久久77777| 亚洲www永久成人夜色| 97视频在线观看免费高清完整版在线观看| 国产精品久久激情| 国产精品久久久久秋霞鲁丝| 国产精品视频中文字幕91| 国产精品一区二区久久国产| 成人免费淫片aa视频免费| 国产精品久久久久久久久| 日韩精品视频在线免费观看| 少妇av一区二区三区| 日韩美女视频免费在线观看| 亚洲精品国产精品国自产观看浪潮| 国产日产欧美精品| 中文字幕精品www乱入免费视频| 亚洲精品影视在线观看| 91精品国产91久久久久福利| 国产亚洲精品久久久久久牛牛| 国产精品白嫩美女在线观看| 久久精品视频在线| 理论片在线不卡免费观看| 中日韩美女免费视频网站在线观看| 午夜精品久久久久久久久久久久久| 91精品中国老女人| 国产精品美女免费视频| 91精品视频在线免费观看| 日韩精品中文字幕在线|