扫描程序无限循环导致浏览器挂起

时间:2013-03-07 16:21:50

标签: java http loops browser

我真的一直试图解决这个问题大约一个小时了,但我根本找不到解决方案。

请看以下代码:

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)连接到 localhost ,它将永远挂起。我必须按下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();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您使用的是HTTP,则应始终发送Content-Length标头。然后接收端确切地知道要读取多少字节的内容。这避免了所有杂乱的“直到EOF”或“直到我找到\ r \ n \ r \ n”问题。