<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

    主站蜘蛛池模板: 亚洲黄色网址大全| 阿v视频免费在线观看| 免费观看大片毛片| 成人免费观看男女羞羞视频 | 亚洲AV无码AV男人的天堂| 国产精品免费精品自在线观看| 亚洲熟妇久久精品| 亚洲午夜久久久久妓女影院 | 亚洲av永久中文无码精品| 亚洲综合精品网站| 无码国产精品一区二区免费虚拟VR | 久久亚洲私人国产精品vA| 日韩高清在线高清免费| 99久久成人国产精品免费 | 中文字幕成人免费高清在线视频| 亚洲综合激情另类小说区| 国产在线ts人妖免费视频| 99热这里只有精品免费播放| 亚洲国产成人久久综合| 久久综合日韩亚洲精品色| 四虎国产精品免费久久影院| 一级毛片不卡片免费观看| 黄色毛片免费网站| 亚洲国产激情在线一区| 国产成人无码综合亚洲日韩| 国产免费观看网站| 狼群影院在线观看免费观看直播 | 精品久久久久久久久免费影院| 一级毛片一级毛片免费毛片| 精品亚洲456在线播放| 亚洲av无码一区二区乱子伦as| 亚洲?V无码乱码国产精品 | 又爽又黄无遮挡高清免费视频| jjizz全部免费看片| 国产成年无码久久久免费| 另类小说亚洲色图| 亚洲一区二区久久| 久久精品国产亚洲AV嫖农村妇女| 色久悠悠婷婷综合在线亚洲| 国产成人精品123区免费视频| 无遮免费网站在线入口|