<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

    主站蜘蛛池模板: 99精品视频在线观看免费专区| 黄色毛片免费网站| 日本免费一区二区久久人人澡| 亚洲国产精品成人AV无码久久综合影院| 亚洲国产精品日韩av不卡在线| 大地资源在线观看免费高清| 亚洲无mate20pro麻豆| 国产免费毛不卡片| 亚洲中文字幕无码中文字| 在线免费观看一级毛片| 精品亚洲av无码一区二区柚蜜| 国产又粗又猛又爽又黄的免费视频 | 亚洲视频免费在线观看| 久久久久亚洲精品无码系列| 久99久精品免费视频热77| 亚洲日本在线观看| 日本妇人成熟免费中文字幕| 亚洲欧美日韩中文无线码| 日本免费一本天堂在线| 一区二区三区免费精品视频 | 中文字幕久久亚洲一区 | 毛片基地免费观看| 色偷偷亚洲第一综合网| 中文字幕亚洲第一| 最近免费中文字幕大全免费版视频 | 永久黄网站色视频免费| 人妻18毛片a级毛片免费看| 久久亚洲国产中v天仙www| 91香蕉国产线观看免费全集| 亚洲人成色在线观看| 国产无遮挡色视频免费视频| 中文字幕在线免费播放| 亚洲妇女水蜜桃av网网站| 国产精品公开免费视频| 大地影院MV在线观看视频免费| 亚洲人成片在线观看| 亚洲A∨精品一区二区三区| 欧洲精品99毛片免费高清观看 | 亚洲一级片在线观看| 亚洲?V乱码久久精品蜜桃| 日韩人妻无码精品久久免费一|