[英]Scanner infinite loop causes browser to hang
我确实已经尝试解决这个问题大约一个小时了,但是我根本找不到解决方案。
看下面的代码:
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();
}
}
}
}
如果您使用的是HTTP,则应始终发送Content-Length标头。 然后,接收端确切地知道要读取多少字节的内容。 这样可以避免所有混乱的“读到EOF”或“直到我发现\\ r \\ n \\ r \\ n”问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.