我试图使用套接字写一个httpserver,我遇到了这个问题。 众所周知,Http请求是这样的。
GET /index.html HTTP/1.1
Cache-Control: max-age=0
Host: 127.0.0.1
Accept:xxxxx
User-Agent: xxxx
Connection: keep-alive
CRLF
This is message body!
问题是如何获得完整的Http请求,包括邮件正文。 我试着这样写。
ServerSocket serverSocket = new ServerSocket(8000);
while (true) {
Socket socket = serverSocket.accept();
new Thread() {
{
InputStream is = socket.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
System.out.print("finish");
}
}.start();
}
控制台永远不会打印"完成"然后我改变了这个
ServerSocket serverSocket = new ServerSocket(8000);
while (true) {
Socket socket = serverSocket.accept();
new Thread() {
{
InputStream is = socket.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(is));
String line = null;
while (input.ready()) {
line = input.readLine();
System.out.println(line);
}
System.out.println("finish");
}
}.start();
}
事情变得更好,我们可以看到"完成"!但是,如果我更快地刷新页面。缓冲区读取器将不会准备就绪并且不会进入{}!
我想打印所有重新请求并且"完成"
请帮帮我。 非常感谢!!
答案 0 :(得分:0)
你的方法都不正确。
在第一个中,input.readLine()
仅在到达流的末尾时返回null
,在请求结束时。这意味着只要浏览器保持TCP连接打开,您就会在那里循环。这可能需要一段时间。另外,可能会在同一个连接上发送多个请求,因此您最终可能会打印所有这些请求(我不知道这是否是您想要做的)。
在第二个中,你有计时问题。 input.ready()
检查接收缓冲区是否包含任何内容,而不是检查请求是否已结束。因此,您可能最终只打印请求的一部分而不是等待整个事情。使用这种方法和正确的时间,您可能最终打印请求的一部分,多个请求或其间的任何内容(如请求和一半)。
另请注意,HTTP GET消息this MSDN documntation,并且没有浏览器会像您的示例中那样请求。