<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無線&移動互聯網技術研發

    換位思考·····
    posts - 19, comments - 53, trackbacks - 0, articles - 283
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    利用java構建http服務器(摘)

    Posted on 2009-12-27 00:12 Gavin.lee 閱讀(429) 評論(0)  編輯  收藏 所屬分類: java SE & EE

    web服務器大家都會用,可是它的實現原理是到底如何呢,其實只要讀一下http協議,大家基本也能開發出一個簡單的web服務器出來了。

    web請求分為如下幾步

    1. 瀏覽器向服務建立TCP/IP連接,Java中通過java.net.Socket實現

    2. Web瀏覽器向Web服務器發送請求命令。通過Socket的輸出流向服務器寫如下信息:

      GET /uri HTTP/1.1,很顯示第一部分為請求的方法,第二部分為請求的URI,第三部分為請求的協議

    3. Web瀏覽器發送請求頭信息。這部分包括瀏覽器的版本信息,接受的格式、編碼等,還有非常有用的一個數據Cookie也是在這里發送的。

    4. 頭信息發送完后,發送一個空格表示結束,如果是post請求,則繼續發送Post正文。

    5. Web服務器做出應答,如返回"HTTP/1.1 200  OK",表示請求成功,或者返回404,500等狀態信息表示找不到頁面或服務器錯誤。

    6. Web服務器發送應答頭信息,這部分表示了返回的內容類型(如是gif還是exe還是html等),返回的數據的編碼,長度,當然還有Cookie(通過set-Cookie來發送)

    7. 在發送完應答頭后,則發送一個空行。如果有響應正文,則在后面繼續發送響應內容。

    8. 關閉TCP/IP連接

    以下代碼簡單的模擬了這一過程。

    客戶端代碼:

    package com.yixun.wap;

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;

    public class Client {
        Socket socket 
    = null;
        
        
    // 1. 建立到服務器的連接
        private void connect() throws Exception {
            socket 
    = new Socket("serverName"80);
        }


        
    // 2. 發送請求命令
        private void sendRequestCommand() throws Exception {
            OutputStream os 
    = socket.getOutputStream();
            os.write(
    "GET /index.html HTTP/1.1\n".getBytes());
        }


        
    // 3. 發送請求頭信息
        private void sendHeader() throws Exception {
            OutputStream os 
    = socket.getOutputStream();
            os.write((
    "Accept: */*\n"
                            
    + "Accept-Language: zh-cn;q=0.5\n"
                            
    + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; CIBA; .NET CLR 2.0.50727)\n"
                            
    + "Host: 192.168.1.110\n" + "Connection: Keep-Alive\n"
                            
    + "\n").getBytes());
            os.flush();
        }


        
    // 4. 檢測服務器發送回來的響應
        private void getResponse() throws Exception {
            InputStream is 
    = socket.getInputStream();
            
    while (is.available() == 0{
                Thread.sleep(
    10);
            }

            BufferedReader br 
    = new BufferedReader(new InputStreamReader(is,
                    
    "utf-8"));
            String line 
    = null;
            
    while ((line = br.readLine()) != null{
                System.out.println(line);
            }

        }

    }


    服務器代碼如下:
    package com.yixun.wap;

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class Server {
        
    private ServerSocket server;

        
    public void start() throws Exception {
            server 
    = new ServerSocket(80);// 監聽80端口
            accept();
        }


        
    private void accept() {
            
    new Thread() {
                
    public void run() {
                    
    while (true{
                        
    try {
                            System.out.println(
    "accept");
                            Socket socket 
    = server.accept();
                            System.out.println(
    "new client.");
                            processRequest(socket);
                        }
     catch (IOException e) {
                            e.printStackTrace();
                        }

                    }

                }

            }
    .start();
        }


        
    private void processRequest(Socket socket) {
            
    new RequestProcessor(socket).start();
        }


        
    // 將每個請求用一個單獨的線程來進行處理,這樣可以實現多個請求的并發處理功能
        private class RequestProcessor extends Thread {
            Socket socket;

            RequestProcessor(Socket socket) 
    {
                
    this.socket = socket;
            }


            
    public void run() {
                
    try {
                    InputStream is 
    = socket.getInputStream();
                    
    while (is.available() == 0{
                        Thread.sleep(
    10); // 檢測客戶端是否發送過來了請求數據
                    }


                    
    while (is.available() > 0{
                        System.out.print((
    char) is.read());// 打印發送過來的所有數據,可以保存起來以做進一步的處理
                    }


                    String info 
    = "HTTP/1.1 200 OK\n"
                            
    + "Server: Apache-Coyote/1.1\n"
                            
    + "Content-Type: text/html;charset=utf-8\n"
                            
    + "Content-Length: 1021\n"
                            
    + "Date: Wed, 09 Dec 2009 05:00:27 GMT\n" + "\n";
                    OutputStream os 
    = socket.getOutputStream();
                    os.write(info.getBytes(
    "utf-8"));
                    os.flush();

                    FileInputStream fis 
    = new FileInputStream("webRoot/index.html");// 假設用戶請求的是index.html,讀取該文件做為響應
                    byte data[] = new byte[1024 * 10];
                    
    int length = 0;
                    
    while ((length = fis.read(data)) > 0{
                        os.write(data, 
    0, length);
                    }

                    os.flush();
                    os.close();
                }
     catch (Exception e) {
                    e.printStackTrace();
                }


            }

        }

    }


    主站蜘蛛池模板: 亚洲av无码成人精品国产| 久久久久久国产a免费观看不卡| 超pen个人视频国产免费观看| 亚洲丁香婷婷综合久久| 亚洲精品456播放| 免费无遮挡无码永久视频| 亚洲情A成黄在线观看动漫软件| 亚洲成人影院在线观看| 最新国产乱人伦偷精品免费网站| 亚洲18在线天美| MM131亚洲国产美女久久| 亚洲人成免费电影| 狠狠热精品免费观看| 久久久久亚洲AV无码网站| 日本成人免费在线| 无码人妻久久一区二区三区免费 | 你是我的城池营垒免费看| avtt天堂网手机版亚洲| 国产精品亚洲αv天堂无码| 99久久99久久精品免费看蜜桃| 一级成人毛片免费观看| 亚洲黄色激情视频| 国产亚洲人成网站观看| 日本免费一二区在线电影| 99久久99久久精品免费观看| 一级毛片正片免费视频手机看 | 日韩色日韩视频亚洲网站| 中文字幕亚洲综合久久2| 亚洲伦乱亚洲h视频| 我要看免费的毛片| 99久久精品国产免费| 一个人晚上在线观看的免费视频 | 18女人腿打开无遮掩免费| 一级毛片视频免费观看| 亚洲欧美日韩中文无线码| 亚洲黄网站wwwwww| 亚洲va久久久噜噜噜久久天堂| 亚洲免费无码在线| 国产成人精品男人免费| 啦啦啦高清视频在线观看免费| 91免费国产精品|