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

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

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

    利用java構建http服務器

    Posted on 2009-12-17 17:26 terryxue 閱讀(2051) 評論(3)  編輯  收藏 所屬分類: java

    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連接

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

    客戶端代碼:

    //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);
      }

    }

    服務器代碼如下:
    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) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                
            }

        }

    Feedback

    # re: 利用java構建http服務器  回復  更多評論   

    2009-12-17 18:13 by simaliu
    呵呵
    我也做過這方面的工作
    有興趣可以交流一下

    # re: 利用java構建http服務器  回復  更多評論   

    2009-12-18 08:35 by mathfox
    這也能上主頁?

    # re: 利用java構建http服務器  回復  更多評論   

    2009-12-18 08:36 by mathfox
    如果你想做web 服務器,

    請搜索how tomcat works,雖然講的是比較老的tomcat,不過還是很有參考價值的。

    我以后我仔細看看

    posts - 9, comments - 24, trackbacks - 0, articles - 0

    Copyright © terryxue

    主站蜘蛛池模板: 亚洲国产国产综合一区首页| 国产免费牲交视频| 曰批全过程免费视频免费看 | 亚洲国产一区二区三区在线观看| 亚洲人成人网站色www| 在线观着免费观看国产黄| 99久久免费精品视频| 一个人晚上在线观看的免费视频| 久久久久无码专区亚洲av| 国产在线精品免费aaa片| 美女尿口扒开图片免费| 亚洲av专区无码观看精品天堂| 久久久久亚洲av无码专区蜜芽| 久久久久亚洲AV成人网人人软件| 国产精品免费一级在线观看| 欧洲乱码伦视频免费| 日韩精品无码免费一区二区三区| 国内精品99亚洲免费高清| 免费在线观看一区| 无遮挡呻吟娇喘视频免费播放| 亚洲国产日韩a在线播放| 亚洲综合一区二区三区四区五区| 国产L精品国产亚洲区久久| 日本黄色免费观看| 在线看片无码永久免费aⅴ| 国产一精品一AV一免费孕妇 | 又粗又大又长又爽免费视频| 最近2019中文字幕免费看最新| 99无码人妻一区二区三区免费 | 亚洲一区无码精品色| 又爽又黄无遮挡高清免费视频| 国产在线不卡免费播放| 日本免费一本天堂在线| 日韩在线视频免费看| 国产在线观看免费不卡| 国产一级淫片免费播放电影| 四虎永久免费地址在线网站| 国产资源免费观看| 一本久久综合亚洲鲁鲁五月天| 无码精品国产一区二区三区免费 | 亚洲精品国产成人|