2016-05-12 25 views
0

我想寫一個簡單的HTTP服務器,僅用於練習,而且我已經插入了20行,並且已經卡住了。簡單的HTTP協議實現不會從InputStream中讀取HTTP請求標頭的循環

package httpd; 

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

public class Httpd { 

    public static void main(String[] args) { 
     try (
       ServerSocket server = new ServerSocket(1500); 
       Socket sock = server.accept(); 
       InputStream in = sock.getInputStream();) { 

      int b; 
      while ((b = in.read()) != -1) { 
       System.out.write(b); 
      } 

      System.out.println("Sending HTTP Response"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

這是所有罰款,頭被寫入到out流在我的控制檯:

GET/HTTP/1.1 
Host: 127.0.0.1:1500 
Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

而且thatls它。之後它就坐在那裏。它從不打印Sending HTTP Response,只是坐在那裏。 Google Chrome正在向後旋轉微調器,等待響應。他們都掛起,直到我殺了谷歌瀏覽器的頁面,然後將服務器輸出Sending HTTP Response

我不能迴應,除非while循環被打破,也不會出於某種原因打破。爲什麼?

編輯:

package httpd; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Httpd { 

    public static void main(String[] args) { 
     try { 
      ServerSocket server = new ServerSocket(1500); 
      Socket sock = server.accept(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 

      int b; 
      while ((b = in.read()) != -1) { 
       System.out.write(b); 
      } 

      System.out.println("Sending HTTP Response"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

這工作。我不知道爲什麼。有人可以解釋嗎?

+0

將嘗試(甚至編譯?) –

+0

查找try-with-resources。它相當於在finally塊中的()括號內的所有資源上調用.close()。 – Gala

回答

0

我認爲發生的事情是TCP連接仍然打開(因爲客戶端正在等待響應),所以輸入流沒有結束,所以read()塊而不是返回-1。我猜BufferedReader的邏輯因某種原因而不同。

閱讀本關於如何檢測請求結束:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4

如果你只是處理GET,那麼你可以找\n\n,但處理POST將需要更復雜的東西。