2013-03-07 101 views
0

我真的一直在努力解決這個問題約一個小時,但我根本無法找到它的解決方案。掃描器無限循環導致瀏覽器掛起

請看下面的代碼:

public void handleRequest() throws IOException { 
    while(in.hasNextLine()) { 
     System.out.println(in.nextLine()); 
    } 

    out.print("HTTP/1.0 200 OK\r\n\r\ntest"); 
    out.flush(); 
} 

如果我在我的瀏覽器(Chrome)連接到本地主機,它會掛到永遠。我必須按下escape(強制它停止請求)才能實際接收從請求中獲得的所有輸入行。

這個想法很簡單;如果請求有下一行,那麼只需要截取該行,直到沒有任何內容,然後發送200 OK響應。但這根本不起作用。

編輯:

@Zutty問其中位於:

public class HttpServer { 
public static final int PORT = 80; 
public static final int BACKLOG = 1; 
public static final String ROOT_CATALOG = "C:/HttpServer/"; 

private ServerSocket server; 
private Socket client; 
private Scanner in; 
private PrintWriter out; 

private FileInputStream fstream; 
private final String TWOHUNDRED = "HTTP/1.0 200 OK\r\n" 
           + "Content-Type: text/html\r\n" 
           + "\r\n"; 

public HttpServer() throws IOException { 
    server = new ServerSocket(PORT, BACKLOG); 
} 

public Socket accept() throws IOException { 
    client = server.accept(); 
    in = new Scanner(client.getInputStream()); 
    out = new PrintWriter(client.getOutputStream()); 

    return client; 
} 

而且在主:

public class Main { 
    public static void main(String[] args) throws IOException { 
     HttpServer server = new HttpServer(); 

     while(true) { 
      try(Socket client = server.accept()) { 
       server.handleRequest(); 
      } 
     } 
    } 
} 
+3

什麼是'在'和它在哪裏設置? – Zutty 2013-03-07 16:23:38

+0

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。這個代碼是在一個applet中運行的嗎? – 2013-03-07 16:29:14

+0

我認爲它永遠不會退出,因爲它永遠找不到和'EOF'。你應該搜索'\ r \ n \ r \ n'來知道請求結束的地方。 – 2013-03-07 16:36:56

回答

1

如果您正在使用HTTP,你應該始終發送內容 - 長頭。然後接收端確切地知道要讀取多少字節的內容。這避免了所有的雜亂「直到EOF」或「直到我發現\ r \ n \ r \ n」問題。